about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/array-from-args56
-rw-r--r--cpp/.traces/buffer-append-works696
-rw-r--r--cpp/.traces/channel300
-rw-r--r--cpp/.traces/channel-initialization60
-rw-r--r--cpp/.traces/channel-new-empty-not-full150
-rw-r--r--cpp/.traces/channel-read-increments-full312
-rw-r--r--cpp/.traces/channel-read-not-full404
-rw-r--r--cpp/.traces/channel-wrap586
-rw-r--r--cpp/.traces/channel-write-full300
-rw-r--r--cpp/.traces/channel-write-increments-free208
-rw-r--r--cpp/.traces/channel-write-not-empty298
-rw-r--r--cpp/.traces/closure42
-rw-r--r--cpp/.traces/integer-to-decimal-digit-negative316
-rw-r--r--cpp/.traces/integer-to-decimal-digit-positive438
-rw-r--r--cpp/.traces/integer-to-decimal-digit-zero14
-rw-r--r--cpp/.traces/interpolate-at-end152
-rw-r--r--cpp/.traces/interpolate-at-start166
-rw-r--r--cpp/.traces/interpolate-works112
-rw-r--r--cpp/.traces/new_array10
-rw-r--r--cpp/.traces/parse_dollar_as_recipe_name1
-rw-r--r--cpp/.traces/print-character-at-top-left541
-rw-r--r--cpp/.traces/string-append-1194
-rw-r--r--cpp/.traces/string-equal-common-lengths-but-distinct152
-rw-r--r--cpp/.traces/string-equal-distinct-lengths34
-rw-r--r--cpp/.traces/string-equal-identical164
-rw-r--r--cpp/.traces/string-equal-reflexive162
-rw-r--r--cpp/.traces/string-equal-with-empty34
-rw-r--r--cpp/011load.cc8
-rw-r--r--cpp/027debug.cc21
-rw-r--r--cpp/042new.cc4
-rw-r--r--cpp/043space.cc2
-rw-r--r--cpp/071print.mu19
32 files changed, 3270 insertions, 2686 deletions
diff --git a/cpp/.traces/array-from-args b/cpp/.traces/array-from-args
index 173e1fb3..d999e006 100644
--- a/cpp/.traces/array-from-args
+++ b/cpp/.traces/array-from-args
@@ -97,8 +97,8 @@ run/0: instruction init-array/8
 run/0: {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 1, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1002 is 3
 mem/0: array size is 3
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1005
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1005
 run/0: instruction init-array/9
 run/0: rewind-ingredients 
 run/0: instruction init-array/10
@@ -130,18 +130,18 @@ mem/0: location 1004 is 1
 run/0: instruction init-array/16
 run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1005 is 1030
+mem/0: location 1005 is 1031
 run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 mem/0: location 1006 is 0
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1008
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1008
 run/0: instruction init-array/17
 run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location", "deref": ]} <- copy {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}
 run/0: ingredient 0 is curr-value
 mem/0: location 1003 is 0
-mem/0: location 1008 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1008 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-array/18
 run/0: {name: "i", value: 5, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 5, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -178,18 +178,18 @@ mem/0: location 1004 is 1
 run/0: instruction init-array/16
 run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1005 is 1030
+mem/0: location 1005 is 1031
 run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 mem/0: location 1006 is 1
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1008
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1008
 run/0: instruction init-array/17
 run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location", "deref": ]} <- copy {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}
 run/0: ingredient 0 is curr-value
 mem/0: location 1003 is 1
-mem/0: location 1008 is 1032
-mem/0: storing 1 in location 1032
+mem/0: location 1008 is 1033
+mem/0: storing 1 in location 1033
 run/0: instruction init-array/18
 run/0: {name: "i", value: 5, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 5, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -226,18 +226,18 @@ mem/0: location 1004 is 1
 run/0: instruction init-array/16
 run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location"]} <- index-address {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location", "deref": ]}, {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1005 is 1030
+mem/0: location 1005 is 1031
 run/0: ingredient 1 is {name: "i", value: 5, type: 1, properties: ["i": "integer"]}
 mem/0: location 1006 is 2
-run/0: address to copy is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1008
+run/0: address to copy is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1008
 run/0: instruction init-array/17
 run/0: {name: "tmp", value: 7, type: 2-1, properties: ["tmp": "address":"location", "deref": ]} <- copy {name: "curr-value", value: 2, type: 1, properties: ["curr-value": "location"]}
 run/0: ingredient 0 is curr-value
 mem/0: location 1003 is 2
-mem/0: location 1008 is 1033
-mem/0: storing 2 in location 1033
+mem/0: location 1008 is 1034
+mem/0: storing 2 in location 1034
 run/0: instruction init-array/18
 run/0: {name: "i", value: 5, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 5, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -265,17 +265,17 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 20
 run/0: instruction init-array/21
 run/0: reply {name: "result", value: 4, type: 2-5-1, properties: ["result": "address":"array":"location"]}
-mem/0: location 1005 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1005 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-array-from-args/1
 run/0: {name: "2", value: 2, type: 5-1, properties: ["2": "array":"location"]} <- copy {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location", "deref": ]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
-mem/0: location 1030 is 3
-mem/0: location 1031 is 0
-mem/0: location 1032 is 1
-mem/0: location 1033 is 2
+mem/0: location 1 is 1031
+mem/0: location 1031 is 3
+mem/0: location 1032 is 0
+mem/0: location 1033 is 1
+mem/0: location 1034 is 2
 mem/0: storing 3 in location 2
 mem/0: storing 0 in location 3
 mem/0: storing 1 in location 4
diff --git a/cpp/.traces/buffer-append-works b/cpp/.traces/buffer-append-works
index 03175513..0cad1113 100644
--- a/cpp/.traces/buffer-append-works
+++ b/cpp/.traces/buffer-append-works
@@ -87,603 +87,603 @@ run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <
 run/0: instruction init-buffer/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1030
+mem/0: new alloc: 1031
 run/0: instruction init-buffer/1
 run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
-mem/0: new alloc: 1060
-mem/0: storing 1060 in location 1032
+mem/0: new alloc: 1062
+mem/0: storing 1062 in location 1033
 run/0: instruction init-buffer/2
 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1032 is 1060
+mem/0: location 1033 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1033
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1034
 run/0: instruction init-buffer/3
 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1033 is 1060
-mem/0: storing 0 in location 1060
+mem/0: location 1034 is 1062
+mem/0: storing 0 in location 1062
 run/0: instruction init-buffer/4
 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1032 is 1060
+mem/0: location 1033 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
-run/0: product 0 is 1061
-mem/0: storing 1061 in location 1034
+run/0: address to copy is 1063
+run/0: product 0 is 1063
+mem/0: storing 1063 in location 1035
 run/0: instruction init-buffer/5
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
-mem/0: storing 3 in location 1035
+mem/0: storing 3 in location 1036
 run/0: instruction init-buffer/6
 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
-mem/0: location 1035 is 3
+mem/0: location 1036 is 3
 mem/0: array size is 3
-mem/0: new alloc: 1062
-mem/0: location 1034 is 1061
-mem/0: storing 1062 in location 1061
+mem/0: new alloc: 1064
+mem/0: location 1035 is 1063
+mem/0: storing 1064 in location 1063
 run/0: instruction init-buffer/7
 run/0: reply {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
-mem/0: location 1032 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1002
+mem/0: location 1033 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1002
 run/0: instruction test-buffer-append-works/2
 run/0: {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]} <- get {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1003
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1003
 run/0: instruction test-buffer-append-works/3
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1065
+mem/0: new alloc: 1068
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1067
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1070
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 97
-mem/0: storing 97 in location 1068
+mem/0: storing 97 in location 1071
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1067 is 1060
+mem/0: location 1070 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1095
+mem/0: new alloc: 1099
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1097
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1101
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1097 is 1060
+mem/0: location 1101 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 0
+mem/0: location 1062 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1098
+mem/0: storing 0 in location 1102
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1097 is 1060
+mem/0: location 1101 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1099
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1103
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1099 is 1062
-mem/0: storing 3 in location 1100
+mem/0: location 1103 is 1064
+mem/0: storing 3 in location 1104
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1098 is 0
+mem/0: location 1102 is 0
 run/0: ingredient 1 is capacity
-mem/0: location 1100 is 3
+mem/0: location 1104 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1101
+mem/0: storing 0 in location 1105
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1101 is 0
+mem/0: location 1105 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1069
+mem/0: storing 0 in location 1072
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1069 is 0
+mem/0: location 1072 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1067 is 1060
+mem/0: location 1070 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1070
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1073
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1067 is 1060
+mem/0: location 1070 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1071
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1074
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1071 is 1062
+mem/0: location 1074 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1070 is 1060
-mem/0: location 1060 is 0
-run/0: address to copy is 1063
-run/0: product 0 is 1063
-mem/0: storing 1063 in location 1072
+mem/0: location 1073 is 1062
+mem/0: location 1062 is 0
+run/0: address to copy is 1065
+run/0: product 0 is 1065
+mem/0: storing 1065 in location 1075
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1068 is 97
-mem/0: location 1072 is 1063
-mem/0: storing 97 in location 1063
+mem/0: location 1071 is 97
+mem/0: location 1075 is 1065
+mem/0: storing 97 in location 1065
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1070 is 1060
-mem/0: location 1060 is 0
+mem/0: location 1073 is 1062
+mem/0: location 1062 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1070 is 1060
-mem/0: storing 1 in location 1060
+mem/0: location 1073 is 1062
+mem/0: storing 1 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1067 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1002
+mem/0: location 1070 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1002
 run/0: instruction test-buffer-append-works/4
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "98", value: 98, type: 0, properties: ["98": "literal"]}
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1125
+mem/0: new alloc: 1130
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1127
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1132
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 98
-mem/0: storing 98 in location 1128
+mem/0: storing 98 in location 1133
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1127 is 1060
+mem/0: location 1132 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1155
+mem/0: new alloc: 1161
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1157
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1163
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1157 is 1060
+mem/0: location 1163 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 1
+mem/0: location 1062 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1158
+mem/0: storing 1 in location 1164
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1157 is 1060
+mem/0: location 1163 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1159
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1165
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1159 is 1062
-mem/0: storing 3 in location 1160
+mem/0: location 1165 is 1064
+mem/0: storing 3 in location 1166
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1158 is 1
+mem/0: location 1164 is 1
 run/0: ingredient 1 is capacity
-mem/0: location 1160 is 3
+mem/0: location 1166 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1161
+mem/0: storing 0 in location 1167
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1161 is 0
+mem/0: location 1167 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1129
+mem/0: storing 0 in location 1134
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1129 is 0
+mem/0: location 1134 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1127 is 1060
+mem/0: location 1132 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1130
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1135
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1127 is 1060
+mem/0: location 1132 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1131
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1136
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1131 is 1062
+mem/0: location 1136 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1130 is 1060
-mem/0: location 1060 is 1
-run/0: address to copy is 1064
-run/0: product 0 is 1064
-mem/0: storing 1064 in location 1132
+mem/0: location 1135 is 1062
+mem/0: location 1062 is 1
+run/0: address to copy is 1066
+run/0: product 0 is 1066
+mem/0: storing 1066 in location 1137
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1128 is 98
-mem/0: location 1132 is 1064
-mem/0: storing 98 in location 1064
+mem/0: location 1133 is 98
+mem/0: location 1137 is 1066
+mem/0: storing 98 in location 1066
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1130 is 1060
-mem/0: location 1060 is 1
+mem/0: location 1135 is 1062
+mem/0: location 1062 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: location 1130 is 1060
-mem/0: storing 2 in location 1060
+mem/0: location 1135 is 1062
+mem/0: storing 2 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1127 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1002
+mem/0: location 1132 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1002
 run/0: instruction test-buffer-append-works/5
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "99", value: 99, type: 0, properties: ["99": "literal"]}
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1185
+mem/0: new alloc: 1192
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1187
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1194
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 99
-mem/0: storing 99 in location 1188
+mem/0: storing 99 in location 1195
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1187 is 1060
+mem/0: location 1194 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1215
+mem/0: new alloc: 1223
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1217
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1225
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1217 is 1060
+mem/0: location 1225 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 2
+mem/0: location 1062 is 2
 run/0: product 0 is 2
-mem/0: storing 2 in location 1218
+mem/0: storing 2 in location 1226
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1217 is 1060
+mem/0: location 1225 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1219
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1227
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1219 is 1062
-mem/0: storing 3 in location 1220
+mem/0: location 1227 is 1064
+mem/0: storing 3 in location 1228
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1218 is 2
+mem/0: location 1226 is 2
 run/0: ingredient 1 is capacity
-mem/0: location 1220 is 3
+mem/0: location 1228 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1221
+mem/0: storing 0 in location 1229
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1221 is 0
+mem/0: location 1229 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1189
+mem/0: storing 0 in location 1196
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1189 is 0
+mem/0: location 1196 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1187 is 1060
+mem/0: location 1194 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1190
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1197
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1187 is 1060
+mem/0: location 1194 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1191
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1198
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1191 is 1062
+mem/0: location 1198 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1190 is 1060
-mem/0: location 1060 is 2
-run/0: address to copy is 1065
-run/0: product 0 is 1065
-mem/0: storing 1065 in location 1192
+mem/0: location 1197 is 1062
+mem/0: location 1062 is 2
+run/0: address to copy is 1067
+run/0: product 0 is 1067
+mem/0: storing 1067 in location 1199
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1188 is 99
-mem/0: location 1192 is 1065
-mem/0: storing 99 in location 1065
+mem/0: location 1195 is 99
+mem/0: location 1199 is 1067
+mem/0: storing 99 in location 1067
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1190 is 1060
-mem/0: location 1060 is 2
+mem/0: location 1197 is 1062
+mem/0: location 1062 is 2
 run/0: ingredient 1 is 1
 run/0: product 0 is 3
-mem/0: location 1190 is 1060
-mem/0: storing 3 in location 1060
+mem/0: location 1197 is 1062
+mem/0: storing 3 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1187 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1002
+mem/0: location 1194 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1002
 run/0: instruction test-buffer-append-works/6
 run/0: {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character"]} <- get {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1004
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1004
 run/0: instruction test-buffer-append-works/7
 run/0: {name: "1", value: 1, type: 3, properties: ["1": "boolean", "raw": ]} <- equal {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]}, {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character"]}
 run/0: ingredient 0 is s1
-mem/0: location 1003 is 1062
+mem/0: location 1003 is 1064
 run/0: ingredient 1 is s2
-mem/0: location 1004 is 1062
+mem/0: location 1004 is 1064
 run/0: product 0 is 1
 mem/0: storing 1 in location 1
 run/0: instruction test-buffer-append-works/8
 run/0: {name: "2", value: 2, type: 5-4, properties: ["2": "array":"character", "raw": ]} <- copy {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character", "deref": ]}
 run/0: ingredient 0 is s2
-mem/0: location 1004 is 1062
-mem/0: location 1062 is 3
-mem/0: location 1063 is 97
-mem/0: location 1064 is 98
-mem/0: location 1065 is 99
+mem/0: location 1004 is 1064
+mem/0: location 1064 is 3
+mem/0: location 1065 is 97
+mem/0: location 1066 is 98
+mem/0: location 1067 is 99
 mem/0: storing 3 in location 2
 mem/0: storing 97 in location 3
 mem/0: storing 98 in location 4
 mem/0: storing 99 in location 5
 run/0: instruction test-buffer-append-works/10
 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "100", value: 100, type: 0, properties: ["100": "literal"]}
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1245
+mem/0: new alloc: 1254
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1247
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1256
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 100
-mem/0: storing 100 in location 1248
+mem/0: storing 100 in location 1257
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1247 is 1060
+mem/0: location 1256 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1275
+mem/0: new alloc: 1285
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1277
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1287
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1277 is 1060
+mem/0: location 1287 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 3
+mem/0: location 1062 is 3
 run/0: product 0 is 3
-mem/0: storing 3 in location 1278
+mem/0: storing 3 in location 1288
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1277 is 1060
+mem/0: location 1287 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1279
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1289
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1279 is 1062
-mem/0: storing 3 in location 1280
+mem/0: location 1289 is 1064
+mem/0: storing 3 in location 1290
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1278 is 3
+mem/0: location 1288 is 3
 run/0: ingredient 1 is capacity
-mem/0: location 1280 is 3
+mem/0: location 1290 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1281
+mem/0: storing 1 in location 1291
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1281 is 1
+mem/0: location 1291 is 1
 run/0: result 0 is 1
-mem/0: storing 1 in location 1249
+mem/0: storing 1 in location 1258
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1249 is 1
+mem/0: location 1258 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction buffer-append/6
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- grow-buffer {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1247 is 1060
+mem/0: location 1256 is 1062
 run/0: instruction grow-buffer/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1305
+mem/0: new alloc: 1316
 run/0: instruction grow-buffer/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1307
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1318
 run/0: instruction grow-buffer/2
 run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1307 is 1060
+mem/0: location 1318 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
-run/0: product 0 is 1061
-mem/0: storing 1061 in location 1308
+run/0: address to copy is 1063
+run/0: product 0 is 1063
+mem/0: storing 1063 in location 1319
 run/0: instruction grow-buffer/3
 run/0: {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} <- length {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}
-mem/0: location 1308 is 1061
-mem/0: location 1061 is 1062
-mem/0: storing 3 in location 1309
+mem/0: location 1319 is 1063
+mem/0: location 1063 is 1064
+mem/0: storing 3 in location 1320
 run/0: instruction grow-buffer/4
 run/0: {name: "newlen", value: 4, type: 1, properties: ["newlen": "integer"]} <- multiply {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]}, {name: "2", value: 2, type: 0, properties: ["2": "literal"]}
 run/0: ingredient 0 is oldlen
-mem/0: location 1309 is 3
+mem/0: location 1320 is 3
 run/0: ingredient 1 is 2
 run/0: ingredient 1 is 2
 run/0: product 0 is 6
-mem/0: storing 6 in location 1310
+mem/0: storing 6 in location 1321
 run/0: instruction grow-buffer/5
 run/0: {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character"]} <- copy {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": ]}
 run/0: ingredient 0 is x
-mem/0: location 1308 is 1061
-mem/0: location 1061 is 1062
-mem/0: storing 1062 in location 1311
+mem/0: location 1319 is 1063
+mem/0: location 1063 is 1064
+mem/0: storing 1064 in location 1322
 run/0: instruction grow-buffer/6
 run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": ]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "newlen", value: 4, type: 1, properties: ["newlen": "integer"]}
-mem/0: location 1310 is 6
+mem/0: location 1321 is 6
 mem/0: array size is 6
-mem/0: new alloc: 1335
-mem/0: location 1308 is 1061
-mem/0: storing 1335 in location 1061
+mem/0: new alloc: 1347
+mem/0: location 1319 is 1063
+mem/0: storing 1347 in location 1063
 run/0: instruction grow-buffer/7
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1312
+mem/0: storing 0 in location 1323
 run/0: instruction grow-buffer/9
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 0
+mem/0: location 1323 is 0
 run/0: ingredient 1 is oldlen
-mem/0: location 1309 is 3
+mem/0: location 1320 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1313
+mem/0: storing 0 in location 1324
 run/0: instruction grow-buffer/10
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]}
-mem/0: location 1313 is 0
+mem/0: location 1324 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction grow-buffer/11
 run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}
-mem/0: location 1311 is 1062
+mem/0: location 1322 is 1064
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1312 is 0
-run/0: address to copy is 1063
+mem/0: location 1323 is 0
+run/0: address to copy is 1065
 run/0: its type is 4
-mem/0: location 1063 is 97
+mem/0: location 1065 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1314
+mem/0: storing 97 in location 1325
 run/0: instruction grow-buffer/12
 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is x
-mem/0: location 1308 is 1061
-mem/0: location 1061 is 1335
+mem/0: location 1319 is 1063
+mem/0: location 1063 is 1347
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1312 is 0
-run/0: address to copy is 1336
-run/0: product 0 is 1336
-mem/0: storing 1336 in location 1315
+mem/0: location 1323 is 0
+run/0: address to copy is 1348
+run/0: product 0 is 1348
+mem/0: storing 1348 in location 1326
 run/0: instruction grow-buffer/13
 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 8, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
-mem/0: location 1314 is 97
-mem/0: location 1315 is 1336
-mem/0: storing 97 in location 1336
+mem/0: location 1325 is 97
+mem/0: location 1326 is 1348
+mem/0: storing 97 in location 1348
 run/0: instruction grow-buffer/14
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 0
+mem/0: location 1323 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1312
+mem/0: storing 1 in location 1323
 run/0: instruction grow-buffer/15
 run/0: loop {name: "", value: -7, type: , properties: ["": ]}
 run/0: ingredient 0 is -7
@@ -691,50 +691,50 @@ run/0: jumping to instruction 9
 run/0: instruction grow-buffer/9
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 1
+mem/0: location 1323 is 1
 run/0: ingredient 1 is oldlen
-mem/0: location 1309 is 3
+mem/0: location 1320 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1313
+mem/0: storing 0 in location 1324
 run/0: instruction grow-buffer/10
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]}
-mem/0: location 1313 is 0
+mem/0: location 1324 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction grow-buffer/11
 run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}
-mem/0: location 1311 is 1062
+mem/0: location 1322 is 1064
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1312 is 1
-run/0: address to copy is 1064
+mem/0: location 1323 is 1
+run/0: address to copy is 1066
 run/0: its type is 4
-mem/0: location 1064 is 98
+mem/0: location 1066 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1314
+mem/0: storing 98 in location 1325
 run/0: instruction grow-buffer/12
 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is x
-mem/0: location 1308 is 1061
-mem/0: location 1061 is 1335
+mem/0: location 1319 is 1063
+mem/0: location 1063 is 1347
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1312 is 1
-run/0: address to copy is 1337
-run/0: product 0 is 1337
-mem/0: storing 1337 in location 1315
+mem/0: location 1323 is 1
+run/0: address to copy is 1349
+run/0: product 0 is 1349
+mem/0: storing 1349 in location 1326
 run/0: instruction grow-buffer/13
 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 8, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
-mem/0: location 1314 is 98
-mem/0: location 1315 is 1337
-mem/0: storing 98 in location 1337
+mem/0: location 1325 is 98
+mem/0: location 1326 is 1349
+mem/0: storing 98 in location 1349
 run/0: instruction grow-buffer/14
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 1
+mem/0: location 1323 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1312
+mem/0: storing 2 in location 1323
 run/0: instruction grow-buffer/15
 run/0: loop {name: "", value: -7, type: , properties: ["": ]}
 run/0: ingredient 0 is -7
@@ -742,50 +742,50 @@ run/0: jumping to instruction 9
 run/0: instruction grow-buffer/9
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 2
+mem/0: location 1323 is 2
 run/0: ingredient 1 is oldlen
-mem/0: location 1309 is 3
+mem/0: location 1320 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1313
+mem/0: storing 0 in location 1324
 run/0: instruction grow-buffer/10
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]}
-mem/0: location 1313 is 0
+mem/0: location 1324 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction grow-buffer/11
 run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}
-mem/0: location 1311 is 1062
+mem/0: location 1322 is 1064
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1312 is 2
-run/0: address to copy is 1065
+mem/0: location 1323 is 2
+run/0: address to copy is 1067
 run/0: its type is 4
-mem/0: location 1065 is 99
+mem/0: location 1067 is 99
 run/0: product 0 is 99
-mem/0: storing 99 in location 1314
+mem/0: storing 99 in location 1325
 run/0: instruction grow-buffer/12
 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is x
-mem/0: location 1308 is 1061
-mem/0: location 1061 is 1335
+mem/0: location 1319 is 1063
+mem/0: location 1063 is 1347
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1312 is 2
-run/0: address to copy is 1338
-run/0: product 0 is 1338
-mem/0: storing 1338 in location 1315
+mem/0: location 1323 is 2
+run/0: address to copy is 1350
+run/0: product 0 is 1350
+mem/0: storing 1350 in location 1326
 run/0: instruction grow-buffer/13
 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 8, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
-mem/0: location 1314 is 99
-mem/0: location 1315 is 1338
-mem/0: storing 99 in location 1338
+mem/0: location 1325 is 99
+mem/0: location 1326 is 1350
+mem/0: storing 99 in location 1350
 run/0: instruction grow-buffer/14
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 2
+mem/0: location 1323 is 2
 run/0: ingredient 1 is 1
 run/0: product 0 is 3
-mem/0: storing 3 in location 1312
+mem/0: storing 3 in location 1323
 run/0: instruction grow-buffer/15
 run/0: loop {name: "", value: -7, type: , properties: ["": ]}
 run/0: ingredient 0 is -7
@@ -793,109 +793,109 @@ run/0: jumping to instruction 9
 run/0: instruction grow-buffer/9
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1312 is 3
+mem/0: location 1323 is 3
 run/0: ingredient 1 is oldlen
-mem/0: location 1309 is 3
+mem/0: location 1320 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1313
+mem/0: storing 1 in location 1324
 run/0: instruction grow-buffer/10
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]}
-mem/0: location 1313 is 1
+mem/0: location 1324 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 16
 run/0: instruction grow-buffer/17
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1307 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1247
+mem/0: location 1318 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1256
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1247 is 1060
+mem/0: location 1256 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1250
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1259
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1247 is 1060
+mem/0: location 1256 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1335
-run/0: product 0 is 1335
-mem/0: storing 1335 in location 1251
+mem/0: location 1063 is 1347
+run/0: product 0 is 1347
+mem/0: storing 1347 in location 1260
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1251 is 1335
+mem/0: location 1260 is 1347
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1250 is 1060
-mem/0: location 1060 is 3
-run/0: address to copy is 1339
-run/0: product 0 is 1339
-mem/0: storing 1339 in location 1252
+mem/0: location 1259 is 1062
+mem/0: location 1062 is 3
+run/0: address to copy is 1351
+run/0: product 0 is 1351
+mem/0: storing 1351 in location 1261
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1248 is 100
-mem/0: location 1252 is 1339
-mem/0: storing 100 in location 1339
+mem/0: location 1257 is 100
+mem/0: location 1261 is 1351
+mem/0: storing 100 in location 1351
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1250 is 1060
-mem/0: location 1060 is 3
+mem/0: location 1259 is 1062
+mem/0: location 1062 is 3
 run/0: ingredient 1 is 1
 run/0: product 0 is 4
-mem/0: location 1250 is 1060
-mem/0: storing 4 in location 1060
+mem/0: location 1259 is 1062
+mem/0: storing 4 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1247 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1002
+mem/0: location 1256 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1002
 run/0: instruction test-buffer-append-works/11
 run/0: {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character"]} <- get {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is x
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1335
-run/0: product 0 is 1335
-mem/0: storing 1335 in location 1005
+mem/0: location 1063 is 1347
+run/0: product 0 is 1347
+mem/0: storing 1347 in location 1005
 run/0: instruction test-buffer-append-works/12
 run/0: {name: "10", value: 10, type: 3, properties: ["10": "boolean", "raw": ]} <- equal {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]}, {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character"]}
 run/0: ingredient 0 is s1
-mem/0: location 1003 is 1062
+mem/0: location 1003 is 1064
 run/0: ingredient 1 is s3
-mem/0: location 1005 is 1335
+mem/0: location 1005 is 1347
 run/0: product 0 is 0
 mem/0: storing 0 in location 10
 run/0: instruction test-buffer-append-works/13
 run/0: {name: "11", value: 11, type: 1, properties: ["11": "integer", "raw": ]} <- get {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is x
-mem/0: location 1002 is 1060
+mem/0: location 1002 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 4
+mem/0: location 1062 is 4
 run/0: product 0 is 4
 mem/0: storing 4 in location 11
 run/0: instruction test-buffer-append-works/14
 run/0: {name: "12", value: 12, type: 5-4, properties: ["12": "array":"character", "raw": ]} <- copy {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character", "deref": ]}
 run/0: ingredient 0 is s3
-mem/0: location 1005 is 1335
-mem/0: location 1335 is 6
-mem/0: location 1336 is 97
-mem/0: location 1337 is 98
-mem/0: location 1338 is 99
-mem/0: location 1339 is 100
-mem/0: location 1340 is 0
-mem/0: location 1341 is 0
+mem/0: location 1005 is 1347
+mem/0: location 1347 is 6
+mem/0: location 1348 is 97
+mem/0: location 1349 is 98
+mem/0: location 1350 is 99
+mem/0: location 1351 is 100
+mem/0: location 1352 is 0
+mem/0: location 1353 is 0
 mem/0: storing 6 in location 12
 mem/0: storing 97 in location 13
 mem/0: storing 98 in location 14
diff --git a/cpp/.traces/channel b/cpp/.traces/channel
index 00679385..50c7ae3b 100644
--- a/cpp/.traces/channel
+++ b/cpp/.traces/channel
@@ -23,34 +23,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
@@ -65,330 +65,330 @@ mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1037
+mem/0: new alloc: 1039
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1039
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1040
+mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1067
+mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1069
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1070
+mem/0: storing 1 in location 1073
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1097
+mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1099
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1099 is 1030
+mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1100
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1100 is 1033
-mem/0: storing 4 in location 1101
+mem/0: location 1104 is 1034
+mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1101 is 4
+mem/0: location 1105 is 4
 run/0: result 0 is 4
-mem/0: storing 4 in location 1071
+mem/0: storing 4 in location 1074
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: ingredient 1 is len
-mem/0: location 1071 is 4
+mem/0: location 1074 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1073
+mem/0: storing 0 in location 1076
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1073 is 0
+mem/0: location 1076 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1074
+mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1074 is 0
+mem/0: location 1077 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1041
+mem/0: storing 0 in location 1043
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1041 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1043
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1045
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1044
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1046
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1043 is 1033
+mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1045
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1047
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1040 is 34
-mem/0: location 1045 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1042 is 34
+mem/0: location 1047 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1044 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1046 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1043 is 1033
-mem/0: storing 4 in location 1046
+mem/0: location 1045 is 1034
+mem/0: storing 4 in location 1048
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1046 is 4
+mem/0: location 1048 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1047
+mem/0: storing 0 in location 1049
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1047 is 0
+mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1039 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1041 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction read/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1127
+mem/0: new alloc: 1132
 run/0: instruction read/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1129
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1134
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1157
+mem/0: new alloc: 1163
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1159
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1165
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1160
+mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1161
+mem/0: storing 1 in location 1167
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1160 is 0
+mem/0: location 1166 is 0
 run/0: ingredient 1 is free
-mem/0: location 1161 is 1
+mem/0: location 1167 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1162
+mem/0: storing 0 in location 1168
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1162 is 0
+mem/0: location 1168 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1130
+mem/0: storing 0 in location 1135
 run/0: instruction read/4
 run/0: break-unless {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1130 is 0
+mem/0: location 1135 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1132
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1137
 run/0: instruction read/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1133
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1138
 run/0: instruction read/10
 run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1133 is 1033
+mem/0: location 1138 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
-mem/0: location 1132 is 1030
-mem/0: location 1030 is 0
-run/0: address to copy is 1034
+mem/0: location 1137 is 1031
+mem/0: location 1031 is 0
+run/0: address to copy is 1035
 run/0: its type is 1
-mem/0: location 1034 is 34
+mem/0: location 1035 is 34
 run/0: product 0 is 34
-mem/0: storing 34 in location 1134
+mem/0: storing 34 in location 1139
 run/0: instruction read/11
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- add {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is full
-mem/0: location 1132 is 1030
-mem/0: location 1030 is 0
+mem/0: location 1137 is 1031
+mem/0: location 1031 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1132 is 1030
-mem/0: storing 1 in location 1030
+mem/0: location 1137 is 1031
+mem/0: storing 1 in location 1031
 run/0: instruction read/13
 run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1133 is 1033
-mem/0: storing 4 in location 1135
+mem/0: location 1138 is 1034
+mem/0: storing 4 in location 1140
 run/0: instruction read/14
 run/0: {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "len", value: 7, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1132 is 1030
-mem/0: location 1030 is 1
+mem/0: location 1137 is 1031
+mem/0: location 1031 is 1
 run/0: ingredient 1 is len
-mem/0: location 1135 is 4
+mem/0: location 1140 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1136
+mem/0: storing 0 in location 1141
 run/0: instruction read/15
 run/0: break-unless {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1136 is 0
+mem/0: location 1141 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
 run/0: reply {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1134 is 34
-mem/0: location 1129 is 1030
+mem/0: location 1139 is 34
+mem/0: location 1134 is 1031
 run/0: result 0 is 34
 mem/0: storing 34 in location 2
-run/0: result 1 is 1030
-mem/0: storing 1030 in location 1
+run/0: result 1 is 1031
+mem/0: storing 1031 in location 1
diff --git a/cpp/.traces/channel-initialization b/cpp/.traces/channel-initialization
index 1fca38e2..e04b4594 100644
--- a/cpp/.traces/channel-initialization
+++ b/cpp/.traces/channel-initialization
@@ -25,34 +25,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
@@ -67,40 +67,40 @@ mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-initialization/1
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 2
 run/0: instruction test-channel-initialization/2
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 3
diff --git a/cpp/.traces/channel-new-empty-not-full b/cpp/.traces/channel-new-empty-not-full
index 46b69534..74584d36 100644
--- a/cpp/.traces/channel-new-empty-not-full
+++ b/cpp/.traces/channel-new-empty-not-full
@@ -21,34 +21,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
@@ -63,159 +63,159 @@ mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-new-empty-not-full/1
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1037
+mem/0: new alloc: 1039
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1039
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1040
+mem/0: storing 0 in location 1042
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1041
+mem/0: storing 0 in location 1043
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1040 is 0
+mem/0: location 1042 is 0
 run/0: ingredient 1 is free
-mem/0: location 1041 is 0
+mem/0: location 1043 is 0
 run/0: product 0 is 1
-mem/0: storing 1 in location 1042
+mem/0: storing 1 in location 1044
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1042 is 1
+mem/0: location 1044 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 2
 run/0: instruction test-channel-new-empty-not-full/2
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1067
+mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1069
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1070
+mem/0: storing 1 in location 1073
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1097
+mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1099
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1099 is 1030
+mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1100
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1100 is 1033
-mem/0: storing 4 in location 1101
+mem/0: location 1104 is 1034
+mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1101 is 4
+mem/0: location 1105 is 4
 run/0: result 0 is 4
-mem/0: storing 4 in location 1071
+mem/0: storing 4 in location 1074
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: ingredient 1 is len
-mem/0: location 1071 is 4
+mem/0: location 1074 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1073
+mem/0: storing 0 in location 1076
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1073 is 0
+mem/0: location 1076 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1074
+mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1074 is 0
+mem/0: location 1077 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
diff --git a/cpp/.traces/channel-read-increments-full b/cpp/.traces/channel-read-increments-full
index a3e68559..ec0c90d1 100644
--- a/cpp/.traces/channel-read-increments-full
+++ b/cpp/.traces/channel-read-increments-full
@@ -35,34 +35,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
@@ -77,349 +77,349 @@ mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-read-increments-full/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1037
+mem/0: new alloc: 1039
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1039
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1040
+mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1067
+mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1069
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1070
+mem/0: storing 1 in location 1073
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1097
+mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1099
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1099 is 1030
+mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1100
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1100 is 1033
-mem/0: storing 4 in location 1101
+mem/0: location 1104 is 1034
+mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1101 is 4
+mem/0: location 1105 is 4
 run/0: result 0 is 4
-mem/0: storing 4 in location 1071
+mem/0: storing 4 in location 1074
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: ingredient 1 is len
-mem/0: location 1071 is 4
+mem/0: location 1074 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1073
+mem/0: storing 0 in location 1076
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1073 is 0
+mem/0: location 1076 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1074
+mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1074 is 0
+mem/0: location 1077 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1041
+mem/0: storing 0 in location 1043
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1041 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1043
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1045
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1044
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1046
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1043 is 1033
+mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1045
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1047
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1040 is 34
-mem/0: location 1045 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1042 is 34
+mem/0: location 1047 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1044 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1046 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1043 is 1033
-mem/0: storing 4 in location 1046
+mem/0: location 1045 is 1034
+mem/0: storing 4 in location 1048
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1046 is 4
+mem/0: location 1048 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1047
+mem/0: storing 0 in location 1049
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1047 is 0
+mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1039 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1041 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-read-increments-full/2
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction read/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1127
+mem/0: new alloc: 1132
 run/0: instruction read/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1129
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1134
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1157
+mem/0: new alloc: 1163
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1159
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1165
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1160
+mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1161
+mem/0: storing 1 in location 1167
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1160 is 0
+mem/0: location 1166 is 0
 run/0: ingredient 1 is free
-mem/0: location 1161 is 1
+mem/0: location 1167 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1162
+mem/0: storing 0 in location 1168
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1162 is 0
+mem/0: location 1168 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1130
+mem/0: storing 0 in location 1135
 run/0: instruction read/4
 run/0: break-unless {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1130 is 0
+mem/0: location 1135 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1132
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1137
 run/0: instruction read/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1133
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1138
 run/0: instruction read/10
 run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1133 is 1033
+mem/0: location 1138 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
-mem/0: location 1132 is 1030
-mem/0: location 1030 is 0
-run/0: address to copy is 1034
+mem/0: location 1137 is 1031
+mem/0: location 1031 is 0
+run/0: address to copy is 1035
 run/0: its type is 1
-mem/0: location 1034 is 34
+mem/0: location 1035 is 34
 run/0: product 0 is 34
-mem/0: storing 34 in location 1134
+mem/0: storing 34 in location 1139
 run/0: instruction read/11
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- add {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is full
-mem/0: location 1132 is 1030
-mem/0: location 1030 is 0
+mem/0: location 1137 is 1031
+mem/0: location 1031 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1132 is 1030
-mem/0: storing 1 in location 1030
+mem/0: location 1137 is 1031
+mem/0: storing 1 in location 1031
 run/0: instruction read/13
 run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1133 is 1033
-mem/0: storing 4 in location 1135
+mem/0: location 1138 is 1034
+mem/0: storing 4 in location 1140
 run/0: instruction read/14
 run/0: {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "len", value: 7, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1132 is 1030
-mem/0: location 1030 is 1
+mem/0: location 1137 is 1031
+mem/0: location 1031 is 1
 run/0: ingredient 1 is len
-mem/0: location 1135 is 4
+mem/0: location 1140 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1136
+mem/0: storing 0 in location 1141
 run/0: instruction read/15
 run/0: break-unless {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1136 is 0
+mem/0: location 1141 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
 run/0: reply {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1134 is 34
-mem/0: location 1129 is 1030
+mem/0: location 1139 is 34
+mem/0: location 1134 is 1031
 run/0: result 0 is 34
-run/0: result 1 is 1030
-mem/0: storing 1030 in location 1
+run/0: result 1 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-read-increments-full/3
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 1
+mem/0: location 1031 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 2
 run/0: instruction test-channel-read-increments-full/4
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 3
diff --git a/cpp/.traces/channel-read-not-full b/cpp/.traces/channel-read-not-full
index 859eaefd..d05be04b 100644
--- a/cpp/.traces/channel-read-not-full
+++ b/cpp/.traces/channel-read-not-full
@@ -31,34 +31,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 1
@@ -73,471 +73,471 @@ mem/0: storing 2 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 2
 mem/0: array size is 2
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-read-not-full/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1035
+mem/0: new alloc: 1037
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1037
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1039
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1038
+mem/0: storing 34 in location 1040
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1065
+mem/0: new alloc: 1068
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1067
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1070
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1068
+mem/0: storing 0 in location 1071
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1068 is 0
+mem/0: location 1071 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1068
+mem/0: storing 1 in location 1071
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1095
+mem/0: new alloc: 1099
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1097
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1101
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1097 is 1030
+mem/0: location 1101 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1098
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1102
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1098 is 1033
-mem/0: storing 2 in location 1099
+mem/0: location 1102 is 1034
+mem/0: storing 2 in location 1103
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1099 is 2
+mem/0: location 1103 is 2
 run/0: result 0 is 2
-mem/0: storing 2 in location 1069
+mem/0: storing 2 in location 1072
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1068 is 1
+mem/0: location 1071 is 1
 run/0: ingredient 1 is len
-mem/0: location 1069 is 2
+mem/0: location 1072 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1071
+mem/0: storing 0 in location 1074
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1071 is 0
+mem/0: location 1074 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1068 is 1
+mem/0: location 1071 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1039
+mem/0: storing 0 in location 1041
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1039 is 0
+mem/0: location 1041 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1041
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1043
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1042
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1044
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1041 is 1033
+mem/0: location 1043 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1043
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1045
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1038 is 34
-mem/0: location 1043 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1040 is 34
+mem/0: location 1045 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1042 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1044 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1041 is 1033
-mem/0: storing 2 in location 1044
+mem/0: location 1043 is 1034
+mem/0: storing 2 in location 1046
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1044 is 2
+mem/0: location 1046 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1045
+mem/0: storing 0 in location 1047
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1037 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1039 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-read-not-full/2
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction read/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1125
+mem/0: new alloc: 1130
 run/0: instruction read/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1127
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1132
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1155
+mem/0: new alloc: 1161
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1157
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1163
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1158
+mem/0: storing 0 in location 1164
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1159
+mem/0: storing 1 in location 1165
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1158 is 0
+mem/0: location 1164 is 0
 run/0: ingredient 1 is free
-mem/0: location 1159 is 1
+mem/0: location 1165 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1160
+mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1160 is 0
+mem/0: location 1166 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1128
+mem/0: storing 0 in location 1133
 run/0: instruction read/4
 run/0: break-unless {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1128 is 0
+mem/0: location 1133 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1130
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1135
 run/0: instruction read/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1131
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1136
 run/0: instruction read/10
 run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1131 is 1033
+mem/0: location 1136 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
-mem/0: location 1130 is 1030
-mem/0: location 1030 is 0
-run/0: address to copy is 1034
+mem/0: location 1135 is 1031
+mem/0: location 1031 is 0
+run/0: address to copy is 1035
 run/0: its type is 1
-mem/0: location 1034 is 34
+mem/0: location 1035 is 34
 run/0: product 0 is 34
-mem/0: storing 34 in location 1132
+mem/0: storing 34 in location 1137
 run/0: instruction read/11
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- add {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is full
-mem/0: location 1130 is 1030
-mem/0: location 1030 is 0
+mem/0: location 1135 is 1031
+mem/0: location 1031 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1130 is 1030
-mem/0: storing 1 in location 1030
+mem/0: location 1135 is 1031
+mem/0: storing 1 in location 1031
 run/0: instruction read/13
 run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1131 is 1033
-mem/0: storing 2 in location 1133
+mem/0: location 1136 is 1034
+mem/0: storing 2 in location 1138
 run/0: instruction read/14
 run/0: {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "len", value: 7, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1130 is 1030
-mem/0: location 1030 is 1
+mem/0: location 1135 is 1031
+mem/0: location 1031 is 1
 run/0: ingredient 1 is len
-mem/0: location 1133 is 2
+mem/0: location 1138 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1134
+mem/0: storing 0 in location 1139
 run/0: instruction read/15
 run/0: break-unless {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1134 is 0
+mem/0: location 1139 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
 run/0: reply {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1132 is 34
-mem/0: location 1127 is 1030
+mem/0: location 1137 is 34
+mem/0: location 1132 is 1031
 run/0: result 0 is 34
-run/0: result 1 is 1030
-mem/0: storing 1030 in location 1
+run/0: result 1 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-read-not-full/3
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1185
+mem/0: new alloc: 1192
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1187
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1194
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1187 is 1030
+mem/0: location 1194 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 1
+mem/0: location 1031 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1188
+mem/0: storing 1 in location 1195
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1187 is 1030
+mem/0: location 1194 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1189
+mem/0: storing 1 in location 1196
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1188 is 1
+mem/0: location 1195 is 1
 run/0: ingredient 1 is free
-mem/0: location 1189 is 1
+mem/0: location 1196 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1190
+mem/0: storing 1 in location 1197
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1190 is 1
+mem/0: location 1197 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 2
 run/0: instruction test-channel-read-not-full/4
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1215
+mem/0: new alloc: 1223
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1217
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1225
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1217 is 1030
+mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1218
+mem/0: storing 1 in location 1226
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1218 is 1
+mem/0: location 1226 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1218
+mem/0: storing 2 in location 1226
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1217 is 1030
+mem/0: location 1225 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1245
+mem/0: new alloc: 1254
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1247
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1256
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1247 is 1030
+mem/0: location 1256 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1248
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1257
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1248 is 1033
-mem/0: storing 2 in location 1249
+mem/0: location 1257 is 1034
+mem/0: storing 2 in location 1258
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1249 is 2
+mem/0: location 1258 is 2
 run/0: result 0 is 2
-mem/0: storing 2 in location 1219
+mem/0: storing 2 in location 1227
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1218 is 2
+mem/0: location 1226 is 2
 run/0: ingredient 1 is len
-mem/0: location 1219 is 2
+mem/0: location 1227 is 2
 run/0: product 0 is 1
-mem/0: storing 1 in location 1220
+mem/0: storing 1 in location 1228
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1220 is 1
+mem/0: location 1228 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction channel-full?/8
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1218
+mem/0: storing 0 in location 1226
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1217 is 1030
+mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 1
+mem/0: location 1031 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1221
+mem/0: storing 1 in location 1229
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1221 is 1
+mem/0: location 1229 is 1
 run/0: ingredient 1 is tmp
-mem/0: location 1218 is 0
+mem/0: location 1226 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1222
+mem/0: storing 0 in location 1230
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1222 is 0
+mem/0: location 1230 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
diff --git a/cpp/.traces/channel-wrap b/cpp/.traces/channel-wrap
index 9cc3177f..fc196654 100644
--- a/cpp/.traces/channel-wrap
+++ b/cpp/.traces/channel-wrap
@@ -57,34 +57,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 1
@@ -99,689 +99,689 @@ mem/0: storing 2 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 2
 mem/0: array size is 2
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-wrap/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1035
+mem/0: new alloc: 1037
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1037
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1039
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1038
+mem/0: storing 34 in location 1040
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1065
+mem/0: new alloc: 1068
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1067
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1070
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1068
+mem/0: storing 0 in location 1071
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1068 is 0
+mem/0: location 1071 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1068
+mem/0: storing 1 in location 1071
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1095
+mem/0: new alloc: 1099
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1097
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1101
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1097 is 1030
+mem/0: location 1101 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1098
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1102
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1098 is 1033
-mem/0: storing 2 in location 1099
+mem/0: location 1102 is 1034
+mem/0: storing 2 in location 1103
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1099 is 2
+mem/0: location 1103 is 2
 run/0: result 0 is 2
-mem/0: storing 2 in location 1069
+mem/0: storing 2 in location 1072
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1068 is 1
+mem/0: location 1071 is 1
 run/0: ingredient 1 is len
-mem/0: location 1069 is 2
+mem/0: location 1072 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1071
+mem/0: storing 0 in location 1074
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1071 is 0
+mem/0: location 1074 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1068 is 1
+mem/0: location 1071 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1039
+mem/0: storing 0 in location 1041
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1039 is 0
+mem/0: location 1041 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1041
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1043
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1042
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1044
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1041 is 1033
+mem/0: location 1043 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1043
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1045
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1038 is 34
-mem/0: location 1043 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1040 is 34
+mem/0: location 1045 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1042 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1044 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1041 is 1033
-mem/0: storing 2 in location 1044
+mem/0: location 1043 is 1034
+mem/0: storing 2 in location 1046
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1044 is 2
+mem/0: location 1046 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1045
+mem/0: storing 0 in location 1047
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1037 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1039 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-wrap/2
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction read/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1125
+mem/0: new alloc: 1130
 run/0: instruction read/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1127
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1132
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1155
+mem/0: new alloc: 1161
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1157
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1163
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1158
+mem/0: storing 0 in location 1164
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1159
+mem/0: storing 1 in location 1165
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1158 is 0
+mem/0: location 1164 is 0
 run/0: ingredient 1 is free
-mem/0: location 1159 is 1
+mem/0: location 1165 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1160
+mem/0: storing 0 in location 1166
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1160 is 0
+mem/0: location 1166 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1128
+mem/0: storing 0 in location 1133
 run/0: instruction read/4
 run/0: break-unless {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1128 is 0
+mem/0: location 1133 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1130
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1135
 run/0: instruction read/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1131
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1136
 run/0: instruction read/10
 run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1131 is 1033
+mem/0: location 1136 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
-mem/0: location 1130 is 1030
-mem/0: location 1030 is 0
-run/0: address to copy is 1034
+mem/0: location 1135 is 1031
+mem/0: location 1031 is 0
+run/0: address to copy is 1035
 run/0: its type is 1
-mem/0: location 1034 is 34
+mem/0: location 1035 is 34
 run/0: product 0 is 34
-mem/0: storing 34 in location 1132
+mem/0: storing 34 in location 1137
 run/0: instruction read/11
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- add {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is full
-mem/0: location 1130 is 1030
-mem/0: location 1030 is 0
+mem/0: location 1135 is 1031
+mem/0: location 1031 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1130 is 1030
-mem/0: storing 1 in location 1030
+mem/0: location 1135 is 1031
+mem/0: storing 1 in location 1031
 run/0: instruction read/13
 run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1131 is 1033
-mem/0: storing 2 in location 1133
+mem/0: location 1136 is 1034
+mem/0: storing 2 in location 1138
 run/0: instruction read/14
 run/0: {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "len", value: 7, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1130 is 1030
-mem/0: location 1030 is 1
+mem/0: location 1135 is 1031
+mem/0: location 1031 is 1
 run/0: ingredient 1 is len
-mem/0: location 1133 is 2
+mem/0: location 1138 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1134
+mem/0: storing 0 in location 1139
 run/0: instruction read/15
 run/0: break-unless {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1134 is 0
+mem/0: location 1139 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 17
 run/0: instruction read/18
 run/0: reply {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1132 is 34
-mem/0: location 1127 is 1030
+mem/0: location 1137 is 34
+mem/0: location 1132 is 1031
 run/0: result 0 is 34
-run/0: result 1 is 1030
-mem/0: storing 1030 in location 1
+run/0: result 1 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-wrap/3
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 2
 run/0: instruction test-channel-wrap/4
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 3
 run/0: instruction test-channel-wrap/5
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1185
+mem/0: new alloc: 1192
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1187
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1194
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1188
+mem/0: storing 34 in location 1195
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1187 is 1030
+mem/0: location 1194 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1215
+mem/0: new alloc: 1223
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1217
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1225
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1217 is 1030
+mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1218
+mem/0: storing 1 in location 1226
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1218 is 1
+mem/0: location 1226 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1218
+mem/0: storing 2 in location 1226
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1217 is 1030
+mem/0: location 1225 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1245
+mem/0: new alloc: 1254
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1247
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1256
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1247 is 1030
+mem/0: location 1256 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1248
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1257
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1248 is 1033
-mem/0: storing 2 in location 1249
+mem/0: location 1257 is 1034
+mem/0: storing 2 in location 1258
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1249 is 2
+mem/0: location 1258 is 2
 run/0: result 0 is 2
-mem/0: storing 2 in location 1219
+mem/0: storing 2 in location 1227
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1218 is 2
+mem/0: location 1226 is 2
 run/0: ingredient 1 is len
-mem/0: location 1219 is 2
+mem/0: location 1227 is 2
 run/0: product 0 is 1
-mem/0: storing 1 in location 1220
+mem/0: storing 1 in location 1228
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1220 is 1
+mem/0: location 1228 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction channel-full?/8
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1218
+mem/0: storing 0 in location 1226
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1217 is 1030
+mem/0: location 1225 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 1
+mem/0: location 1031 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1221
+mem/0: storing 1 in location 1229
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1221 is 1
+mem/0: location 1229 is 1
 run/0: ingredient 1 is tmp
-mem/0: location 1218 is 0
+mem/0: location 1226 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1222
+mem/0: storing 0 in location 1230
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1222 is 0
+mem/0: location 1230 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1189
+mem/0: storing 0 in location 1196
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1189 is 0
+mem/0: location 1196 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1187 is 1030
+mem/0: location 1194 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1191
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1198
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1187 is 1030
+mem/0: location 1194 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1192
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1199
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1191 is 1033
+mem/0: location 1198 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1192 is 1031
-mem/0: location 1031 is 1
-run/0: address to copy is 1035
-run/0: product 0 is 1035
-mem/0: storing 1035 in location 1193
+mem/0: location 1199 is 1032
+mem/0: location 1032 is 1
+run/0: address to copy is 1036
+run/0: product 0 is 1036
+mem/0: storing 1036 in location 1200
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1188 is 34
-mem/0: location 1193 is 1035
-mem/0: storing 34 in location 1035
+mem/0: location 1195 is 34
+mem/0: location 1200 is 1036
+mem/0: storing 34 in location 1036
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1192 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1199 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: location 1192 is 1031
-mem/0: storing 2 in location 1031
+mem/0: location 1199 is 1032
+mem/0: storing 2 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1191 is 1033
-mem/0: storing 2 in location 1194
+mem/0: location 1198 is 1034
+mem/0: storing 2 in location 1201
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1192 is 1031
-mem/0: location 1031 is 2
+mem/0: location 1199 is 1032
+mem/0: location 1032 is 2
 run/0: ingredient 1 is len
-mem/0: location 1194 is 2
+mem/0: location 1201 is 2
 run/0: product 0 is 1
-mem/0: storing 1 in location 1195
+mem/0: storing 1 in location 1202
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1195 is 1
+mem/0: location 1202 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction write/18
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1192 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1199 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1187 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1194 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-wrap/6
 run/0: {name: "4", value: 4, type: 1, properties: ["4": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 4
 run/0: instruction test-channel-wrap/7
 run/0: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction read/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1275
+mem/0: new alloc: 1285
 run/0: instruction read/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1277
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1287
 run/0: instruction read/3
 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1277 is 1030
+mem/0: location 1287 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1305
+mem/0: new alloc: 1316
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1307
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1318
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1307 is 1030
+mem/0: location 1318 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 1
+mem/0: location 1031 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1308
+mem/0: storing 1 in location 1319
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1307 is 1030
+mem/0: location 1318 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1309
+mem/0: storing 0 in location 1320
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1308 is 1
+mem/0: location 1319 is 1
 run/0: ingredient 1 is free
-mem/0: location 1309 is 0
+mem/0: location 1320 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1310
+mem/0: storing 0 in location 1321
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1310 is 0
+mem/0: location 1321 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1278
+mem/0: storing 0 in location 1288
 run/0: instruction read/4
 run/0: break-unless {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1278 is 0
+mem/0: location 1288 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction read/8
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1277 is 1030
+mem/0: location 1287 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1280
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1290
 run/0: instruction read/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1277 is 1030
+mem/0: location 1287 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1281
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1291
 run/0: instruction read/10
 run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
 run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1281 is 1033
+mem/0: location 1291 is 1034
 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}
-mem/0: location 1280 is 1030
-mem/0: location 1030 is 1
-run/0: address to copy is 1035
+mem/0: location 1290 is 1031
+mem/0: location 1031 is 1
+run/0: address to copy is 1036
 run/0: its type is 1
-mem/0: location 1035 is 34
+mem/0: location 1036 is 34
 run/0: product 0 is 34
-mem/0: storing 34 in location 1282
+mem/0: storing 34 in location 1292
 run/0: instruction read/11
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- add {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is full
-mem/0: location 1280 is 1030
-mem/0: location 1030 is 1
+mem/0: location 1290 is 1031
+mem/0: location 1031 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: location 1280 is 1030
-mem/0: storing 2 in location 1030
+mem/0: location 1290 is 1031
+mem/0: storing 2 in location 1031
 run/0: instruction read/13
 run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1281 is 1033
-mem/0: storing 2 in location 1283
+mem/0: location 1291 is 1034
+mem/0: storing 2 in location 1293
 run/0: instruction read/14
 run/0: {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "len", value: 7, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1280 is 1030
-mem/0: location 1030 is 2
+mem/0: location 1290 is 1031
+mem/0: location 1031 is 2
 run/0: ingredient 1 is len
-mem/0: location 1283 is 2
+mem/0: location 1293 is 2
 run/0: product 0 is 1
-mem/0: storing 1 in location 1284
+mem/0: storing 1 in location 1294
 run/0: instruction read/15
 run/0: break-unless {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1284 is 1
+mem/0: location 1294 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction read/16
 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1280 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1290 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction read/18
 run/0: reply {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1282 is 34
-mem/0: location 1277 is 1030
+mem/0: location 1292 is 34
+mem/0: location 1287 is 1031
 run/0: result 0 is 34
-run/0: result 1 is 1030
-mem/0: storing 1030 in location 1
+run/0: result 1 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-wrap/8
 run/0: {name: "5", value: 5, type: 1, properties: ["5": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 5
diff --git a/cpp/.traces/channel-write-full b/cpp/.traces/channel-write-full
index fe81114d..121c73bf 100644
--- a/cpp/.traces/channel-write-full
+++ b/cpp/.traces/channel-write-full
@@ -26,34 +26,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 1
@@ -68,345 +68,345 @@ mem/0: storing 2 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 2
 mem/0: array size is 2
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-write-full/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1035
+mem/0: new alloc: 1037
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1037
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1039
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1038
+mem/0: storing 34 in location 1040
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1065
+mem/0: new alloc: 1068
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1067
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1070
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1068
+mem/0: storing 0 in location 1071
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1068 is 0
+mem/0: location 1071 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1068
+mem/0: storing 1 in location 1071
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1095
+mem/0: new alloc: 1099
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1097
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1101
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1097 is 1030
+mem/0: location 1101 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1098
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1102
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1098 is 1033
-mem/0: storing 2 in location 1099
+mem/0: location 1102 is 1034
+mem/0: storing 2 in location 1103
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1099 is 2
+mem/0: location 1103 is 2
 run/0: result 0 is 2
-mem/0: storing 2 in location 1069
+mem/0: storing 2 in location 1072
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1068 is 1
+mem/0: location 1071 is 1
 run/0: ingredient 1 is len
-mem/0: location 1069 is 2
+mem/0: location 1072 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1067 is 1030
+mem/0: location 1070 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1071
+mem/0: storing 0 in location 1074
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1071 is 0
+mem/0: location 1074 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1068 is 1
+mem/0: location 1071 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1039
+mem/0: storing 0 in location 1041
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1039 is 0
+mem/0: location 1041 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1041
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1043
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1037 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1042
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1044
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1041 is 1033
+mem/0: location 1043 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1043
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1045
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1038 is 34
-mem/0: location 1043 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1040 is 34
+mem/0: location 1045 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1042 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1044 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1041 is 1033
-mem/0: storing 2 in location 1044
+mem/0: location 1043 is 1034
+mem/0: storing 2 in location 1046
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1042 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1044 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1044 is 2
+mem/0: location 1046 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1045
+mem/0: storing 0 in location 1047
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1037 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1039 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-write-full/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1125
+mem/0: new alloc: 1130
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1127
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1132
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1128
+mem/0: storing 0 in location 1133
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1127 is 1030
+mem/0: location 1132 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1129
+mem/0: storing 1 in location 1134
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1128 is 0
+mem/0: location 1133 is 0
 run/0: ingredient 1 is free
-mem/0: location 1129 is 1
+mem/0: location 1134 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1130
+mem/0: storing 0 in location 1135
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1130 is 0
+mem/0: location 1135 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 2
 run/0: instruction test-channel-write-full/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1155
+mem/0: new alloc: 1161
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1157
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1163
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1158
+mem/0: storing 1 in location 1164
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1158 is 1
+mem/0: location 1164 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1158
+mem/0: storing 2 in location 1164
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1185
+mem/0: new alloc: 1192
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1187
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1194
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1187 is 1030
+mem/0: location 1194 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1188
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1195
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1188 is 1033
-mem/0: storing 2 in location 1189
+mem/0: location 1195 is 1034
+mem/0: storing 2 in location 1196
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1189 is 2
+mem/0: location 1196 is 2
 run/0: result 0 is 2
-mem/0: storing 2 in location 1159
+mem/0: storing 2 in location 1165
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1158 is 2
+mem/0: location 1164 is 2
 run/0: ingredient 1 is len
-mem/0: location 1159 is 2
+mem/0: location 1165 is 2
 run/0: product 0 is 1
-mem/0: storing 1 in location 1160
+mem/0: storing 1 in location 1166
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1160 is 1
+mem/0: location 1166 is 1
 run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction channel-full?/8
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1158
+mem/0: storing 0 in location 1164
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1157 is 1030
+mem/0: location 1163 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1161
+mem/0: storing 0 in location 1167
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1161 is 0
+mem/0: location 1167 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1158 is 0
+mem/0: location 1164 is 0
 run/0: product 0 is 1
-mem/0: storing 1 in location 1162
+mem/0: storing 1 in location 1168
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1162 is 1
+mem/0: location 1168 is 1
 run/0: result 0 is 1
 mem/0: storing 1 in location 3
diff --git a/cpp/.traces/channel-write-increments-free b/cpp/.traces/channel-write-increments-free
index f060c64c..397bd2b9 100644
--- a/cpp/.traces/channel-write-increments-free
+++ b/cpp/.traces/channel-write-increments-free
@@ -30,34 +30,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
@@ -72,223 +72,223 @@ mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-write-increments-free/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1037
+mem/0: new alloc: 1039
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1039
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1040
+mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1067
+mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1069
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1070
+mem/0: storing 1 in location 1073
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1097
+mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1099
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1099 is 1030
+mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1100
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1100 is 1033
-mem/0: storing 4 in location 1101
+mem/0: location 1104 is 1034
+mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1101 is 4
+mem/0: location 1105 is 4
 run/0: result 0 is 4
-mem/0: storing 4 in location 1071
+mem/0: storing 4 in location 1074
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: ingredient 1 is len
-mem/0: location 1071 is 4
+mem/0: location 1074 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1073
+mem/0: storing 0 in location 1076
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1073 is 0
+mem/0: location 1076 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1074
+mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1074 is 0
+mem/0: location 1077 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1041
+mem/0: storing 0 in location 1043
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1041 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1043
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1045
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1044
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1046
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1043 is 1033
+mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1045
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1047
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1040 is 34
-mem/0: location 1045 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1042 is 34
+mem/0: location 1047 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1044 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1046 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1043 is 1033
-mem/0: storing 4 in location 1046
+mem/0: location 1045 is 1034
+mem/0: storing 4 in location 1048
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1046 is 4
+mem/0: location 1048 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1047
+mem/0: storing 0 in location 1049
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1047 is 0
+mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1039 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1041 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-write-increments-free/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
 mem/0: storing 0 in location 2
 run/0: instruction test-channel-write-increments-free/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- get {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
 mem/0: storing 1 in location 3
diff --git a/cpp/.traces/channel-write-not-empty b/cpp/.traces/channel-write-not-empty
index 45a4a267..bf541002 100644
--- a/cpp/.traces/channel-write-not-empty
+++ b/cpp/.traces/channel-write-not-empty
@@ -26,34 +26,34 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction init-channel/1
 run/0: {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]} <- new {name: "channel", value: 10, type: 0, properties: ["channel": "type"]}
-mem/0: new alloc: 1030
-mem/0: storing 1030 in location 1002
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction init-channel/2
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1003
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1003
 run/0: instruction init-channel/3
 run/0: {name: "full", value: 2, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1003 is 1030
-mem/0: storing 0 in location 1030
+mem/0: location 1003 is 1031
+mem/0: storing 0 in location 1031
 run/0: instruction init-channel/4
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1004
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1004
 run/0: instruction init-channel/5
 run/0: {name: "free", value: 3, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1004 is 1031
-mem/0: storing 0 in location 1031
+mem/0: location 1004 is 1032
+mem/0: storing 0 in location 1032
 run/0: instruction init-channel/6
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 3
@@ -68,342 +68,342 @@ mem/0: storing 4 in location 1005
 run/0: instruction init-channel/8
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location"]} <- get-address {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
-run/0: product 0 is 1032
-mem/0: storing 1032 in location 1006
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1006
 run/0: instruction init-channel/9
 run/0: {name: "dest", value: 5, type: 2-2-5-1, properties: ["dest": "address":"address":"array":"location", "deref": ]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 mem/0: location 1005 is 4
 mem/0: array size is 4
-mem/0: new alloc: 1033
-mem/0: location 1006 is 1032
-mem/0: storing 1033 in location 1032
+mem/0: new alloc: 1034
+mem/0: location 1006 is 1033
+mem/0: storing 1034 in location 1033
 run/0: instruction init-channel/10
 run/0: reply {name: "result", value: 1, type: 2-10, properties: ["result": "address":"channel"]}
-mem/0: location 1002 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-write-not-empty/1
 run/0: {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- write {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}, {name: "34", value: 34, type: 0, properties: ["34": "literal"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction write/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1037
+mem/0: new alloc: 1039
 run/0: instruction write/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1039
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction write/2
 run/0: {name: "val", value: 2, type: 1, properties: ["val": "location"]} <- next-ingredient 
 run/0: product 0 is 34
-mem/0: storing 34 in location 1040
+mem/0: storing 34 in location 1042
 run/0: instruction write/4
 run/0: {name: "full", value: 3, type: 3, properties: ["full": "boolean"]} <- channel-full? {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1067
+mem/0: new alloc: 1070
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1069
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1072
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 0
+mem/0: location 1032 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1070
+mem/0: storing 0 in location 1073
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 0
+mem/0: location 1073 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1070
+mem/0: storing 1 in location 1073
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1097
+mem/0: new alloc: 1101
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1099
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1103
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1099 is 1030
+mem/0: location 1103 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1100
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1104
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1100 is 1033
-mem/0: storing 4 in location 1101
+mem/0: location 1104 is 1034
+mem/0: storing 4 in location 1105
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1101 is 4
+mem/0: location 1105 is 4
 run/0: result 0 is 4
-mem/0: storing 4 in location 1071
+mem/0: storing 4 in location 1074
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: ingredient 1 is len
-mem/0: location 1071 is 4
+mem/0: location 1074 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1072
+mem/0: storing 0 in location 1075
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1072 is 0
+mem/0: location 1075 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1069 is 1030
+mem/0: location 1072 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1073
+mem/0: storing 0 in location 1076
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1073 is 0
+mem/0: location 1076 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1070 is 1
+mem/0: location 1073 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1074
+mem/0: storing 0 in location 1077
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1074 is 0
+mem/0: location 1077 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1041
+mem/0: storing 0 in location 1043
 run/0: instruction write/5
 run/0: break-unless {name: "full", value: 3, type: 3, properties: ["full": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]}
-mem/0: location 1041 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 8
 run/0: instruction write/9
 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1043
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1045
 run/0: instruction write/10
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer"]} <- get-address {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1039 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1044
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1046
 run/0: instruction write/11
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location"]} <- index-address {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
 run/0: ingredient 0 is circular-buffer
-mem/0: location 1043 is 1033
+mem/0: location 1045 is 1034
 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
-run/0: address to copy is 1034
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1045
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1047
 run/0: instruction write/12
 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy {name: "val", value: 2, type: 1, properties: ["val": "location"]}
 run/0: ingredient 0 is val
-mem/0: location 1040 is 34
-mem/0: location 1045 is 1034
-mem/0: storing 34 in location 1034
+mem/0: location 1042 is 34
+mem/0: location 1047 is 1035
+mem/0: storing 34 in location 1035
 run/0: instruction write/13
 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 0
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1044 is 1031
-mem/0: storing 1 in location 1031
+mem/0: location 1046 is 1032
+mem/0: storing 1 in location 1032
 run/0: instruction write/15
 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}
-mem/0: location 1043 is 1033
-mem/0: storing 4 in location 1046
+mem/0: location 1045 is 1034
+mem/0: storing 4 in location 1048
 run/0: instruction write/16
 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is free
-mem/0: location 1044 is 1031
-mem/0: location 1031 is 1
+mem/0: location 1046 is 1032
+mem/0: location 1032 is 1
 run/0: ingredient 1 is len
-mem/0: location 1046 is 4
+mem/0: location 1048 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1047
+mem/0: storing 0 in location 1049
 run/0: instruction write/17
 run/0: break-unless {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1047 is 0
+mem/0: location 1049 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 19
 run/0: instruction write/20
 run/0: reply {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]}
-mem/0: location 1039 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1041 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-channel-write-not-empty/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- channel-empty? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-empty?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1127
+mem/0: new alloc: 1132
 run/0: instruction channel-empty?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1129
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1134
 run/0: instruction channel-empty?/2
 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1130
+mem/0: storing 0 in location 1135
 run/0: instruction channel-empty?/3
 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1129 is 1030
+mem/0: location 1134 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1131
+mem/0: storing 1 in location 1136
 run/0: instruction channel-empty?/4
 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1130 is 0
+mem/0: location 1135 is 0
 run/0: ingredient 1 is free
-mem/0: location 1131 is 1
+mem/0: location 1136 is 1
 run/0: product 0 is 0
-mem/0: storing 0 in location 1132
+mem/0: storing 0 in location 1137
 run/0: instruction channel-empty?/5
 run/0: reply {name: "result", value: 4, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1132 is 0
+mem/0: location 1137 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 2
 run/0: instruction test-channel-write-not-empty/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- channel-full? {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]}
-mem/0: location 1 is 1030
+mem/0: location 1 is 1031
 run/0: instruction channel-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1157
+mem/0: new alloc: 1163
 run/0: instruction channel-full?/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1159
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1165
 run/0: instruction channel-full?/2
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-free
-run/0: address to copy is 1031
+run/0: address to copy is 1032
 run/0: its type is 1
-mem/0: location 1031 is 1
+mem/0: location 1032 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1160
+mem/0: storing 1 in location 1166
 run/0: instruction channel-full?/3
 run/0: {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]} <- add {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1160 is 1
+mem/0: location 1166 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1160
+mem/0: storing 2 in location 1166
 run/0: instruction channel-full?/5
 run/0: {name: "len", value: 3, type: 1, properties: ["len": "integer"]} <- channel-capacity {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]}
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: instruction channel-capacity/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1187
+mem/0: new alloc: 1194
 run/0: instruction channel-capacity/1
 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1189
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1196
 run/0: instruction channel-capacity/2
 run/0: {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1189 is 1030
+mem/0: location 1196 is 1031
 run/0: ingredient 1 is data
-run/0: address to copy is 1032
+run/0: address to copy is 1033
 run/0: its type is 2
-mem/0: location 1032 is 1033
-run/0: product 0 is 1033
-mem/0: storing 1033 in location 1190
+mem/0: location 1033 is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1197
 run/0: instruction channel-capacity/3
 run/0: {name: "result", value: 3, type: 1, properties: ["result": "integer"]} <- length {name: "q", value: 2, type: 2-5-1, properties: ["q": "address":"array":"location", "deref": ]}
-mem/0: location 1190 is 1033
-mem/0: storing 4 in location 1191
+mem/0: location 1197 is 1034
+mem/0: storing 4 in location 1198
 run/0: instruction channel-capacity/4
 run/0: reply {name: "result", value: 3, type: 1, properties: ["result": "integer"]}
-mem/0: location 1191 is 4
+mem/0: location 1198 is 4
 run/0: result 0 is 4
-mem/0: storing 4 in location 1161
+mem/0: storing 4 in location 1167
 run/0: instruction channel-full?/6
 run/0: {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}, {name: "len", value: 3, type: 1, properties: ["len": "integer"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1160 is 2
+mem/0: location 1166 is 2
 run/0: ingredient 1 is len
-mem/0: location 1161 is 4
+mem/0: location 1167 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1162
+mem/0: storing 0 in location 1168
 run/0: instruction channel-full?/7
 run/0: break-unless {name: "at-end?", value: 4, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1162 is 0
+mem/0: location 1168 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 9
 run/0: instruction channel-full?/10
 run/0: {name: "full", value: 5, type: 1, properties: ["full": "integer"]} <- get {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 run/0: ingredient 0 is chan
-mem/0: location 1159 is 1030
+mem/0: location 1165 is 1031
 run/0: ingredient 1 is first-full
-run/0: address to copy is 1030
+run/0: address to copy is 1031
 run/0: its type is 1
-mem/0: location 1030 is 0
+mem/0: location 1031 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1163
+mem/0: storing 0 in location 1169
 run/0: instruction channel-full?/11
 run/0: {name: "result", value: 6, type: 3, properties: ["result": "boolean"]} <- equal {name: "full", value: 5, type: 1, properties: ["full": "integer"]}, {name: "tmp", value: 2, type: 1, properties: ["tmp": "integer"]}
 run/0: ingredient 0 is full
-mem/0: location 1163 is 0
+mem/0: location 1169 is 0
 run/0: ingredient 1 is tmp
-mem/0: location 1160 is 2
+mem/0: location 1166 is 2
 run/0: product 0 is 0
-mem/0: storing 0 in location 1164
+mem/0: storing 0 in location 1170
 run/0: instruction channel-full?/12
 run/0: reply {name: "result", value: 6, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1164 is 0
+mem/0: location 1170 is 0
 run/0: result 0 is 0
 mem/0: storing 0 in location 3
diff --git a/cpp/.traces/closure b/cpp/.traces/closure
index eea62ad0..de197db2 100644
--- a/cpp/.traces/closure
+++ b/cpp/.traces/closure
@@ -71,70 +71,70 @@ run/0: {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"l
 run/0: instruction init-counter/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1030
+mem/0: new alloc: 1031
 run/0: instruction init-counter/1
 run/0: {name: "x", value: 1, type: 1, properties: ["x": "integer"]} <- copy {name: "23", value: 23, type: 0, properties: ["23": "literal"]}
 run/0: ingredient 0 is 23
-mem/0: storing 23 in location 1032
+mem/0: storing 23 in location 1033
 run/0: instruction init-counter/2
 run/0: {name: "y", value: 2, type: 1, properties: ["y": "integer"]} <- copy {name: "3", value: 3, type: 0, properties: ["3": "literal"]}
 run/0: ingredient 0 is 3
-mem/0: storing 3 in location 1033
+mem/0: storing 3 in location 1034
 run/0: instruction init-counter/3
 run/0: reply {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1002
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1002
 run/0: instruction main/2
 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer", "raw": ]} <- increment-counter {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: instruction increment-counter/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "space", value: 0, type: 0, properties: ["space": "literal"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1060
+mem/0: new alloc: 1062
 run/0: instruction increment-counter/1
 run/0: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1061
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1063
 run/0: instruction increment-counter/2
 run/0: {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]} <- add {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is y
-mem/0: location 1033 is 3
+mem/0: location 1034 is 3
 run/0: ingredient 1 is 1
 run/0: product 0 is 4
-mem/0: storing 4 in location 1033
+mem/0: storing 4 in location 1034
 run/0: instruction increment-counter/3
 run/0: {name: "y", value: 1, type: 1, properties: ["y": "integer"]} <- copy {name: "234", value: 234, type: 0, properties: ["234": "literal"]}
 run/0: ingredient 0 is 234
-mem/0: storing 234 in location 1062
+mem/0: storing 234 in location 1064
 run/0: instruction increment-counter/4
 run/0: reply {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}
-mem/0: location 1033 is 4
+mem/0: location 1034 is 4
 run/0: result 0 is 4
 mem/0: storing 4 in location 2
 run/0: instruction main/3
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer", "raw": ]} <- increment-counter {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
 run/0: instruction increment-counter/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "space", value: 0, type: 0, properties: ["space": "literal"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1090
+mem/0: new alloc: 1093
 run/0: instruction increment-counter/1
 run/0: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1091
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1094
 run/0: instruction increment-counter/2
 run/0: {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]} <- add {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is y
-mem/0: location 1033 is 4
+mem/0: location 1034 is 4
 run/0: ingredient 1 is 1
 run/0: product 0 is 5
-mem/0: storing 5 in location 1033
+mem/0: storing 5 in location 1034
 run/0: instruction increment-counter/3
 run/0: {name: "y", value: 1, type: 1, properties: ["y": "integer"]} <- copy {name: "234", value: 234, type: 0, properties: ["234": "literal"]}
 run/0: ingredient 0 is 234
-mem/0: storing 234 in location 1092
+mem/0: storing 234 in location 1095
 run/0: instruction increment-counter/4
 run/0: reply {name: "y", value: 2, type: 1, properties: ["y": "integer", "space": "1"]}
-mem/0: location 1033 is 5
+mem/0: location 1034 is 5
 run/0: result 0 is 5
 mem/0: storing 5 in location 3
diff --git a/cpp/.traces/integer-to-decimal-digit-negative b/cpp/.traces/integer-to-decimal-digit-negative
index 39d56dd2..ef47b493 100644
--- a/cpp/.traces/integer-to-decimal-digit-negative
+++ b/cpp/.traces/integer-to-decimal-digit-negative
@@ -58,48 +58,48 @@ run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"
 run/0: instruction init-buffer/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1030
+mem/0: new alloc: 1031
 run/0: instruction init-buffer/1
 run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
-mem/0: new alloc: 1060
-mem/0: storing 1060 in location 1032
+mem/0: new alloc: 1062
+mem/0: storing 1062 in location 1033
 run/0: instruction init-buffer/2
 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1032 is 1060
+mem/0: location 1033 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1033
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1034
 run/0: instruction init-buffer/3
 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1033 is 1060
-mem/0: storing 0 in location 1060
+mem/0: location 1034 is 1062
+mem/0: storing 0 in location 1062
 run/0: instruction init-buffer/4
 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1032 is 1060
+mem/0: location 1033 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
-run/0: product 0 is 1061
-mem/0: storing 1061 in location 1034
+run/0: address to copy is 1063
+run/0: product 0 is 1063
+mem/0: storing 1063 in location 1035
 run/0: instruction init-buffer/5
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 30
-mem/0: storing 30 in location 1035
+mem/0: storing 30 in location 1036
 run/0: instruction init-buffer/6
 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
-mem/0: location 1035 is 30
+mem/0: location 1036 is 30
 mem/0: array size is 30
-mem/0: new alloc: 1062
-mem/0: location 1034 is 1061
-mem/0: storing 1062 in location 1061
+mem/0: new alloc: 1064
+mem/0: location 1035 is 1063
+mem/0: storing 1064 in location 1063
 run/0: instruction init-buffer/7
 run/0: reply {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
-mem/0: location 1032 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1033 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/15
 run/0: {name: "digit-base", value: 6, type: 1, properties: ["digit-base": "integer"]} <- copy {name: "48", value: 48, type: 0, properties: ["48": "literal"]}
 run/0: ingredient 0 is 48
@@ -135,122 +135,122 @@ run/0: product 0 is 49
 mem/0: storing 49 in location 1010
 run/0: instruction integer-to-decimal-string/21
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- buffer-append {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]}, {name: "c", value: 9, type: 4, properties: ["c": "character"]}
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 mem/0: location 1010 is 49
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1092
+mem/0: new alloc: 1095
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1094
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1097
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 49
-mem/0: storing 49 in location 1095
+mem/0: storing 49 in location 1098
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1094 is 1060
+mem/0: location 1097 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1122
+mem/0: new alloc: 1126
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1124
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1128
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1124 is 1060
+mem/0: location 1128 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 0
+mem/0: location 1062 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1125
+mem/0: storing 0 in location 1129
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1124 is 1060
+mem/0: location 1128 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1126
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1130
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1126 is 1062
-mem/0: storing 30 in location 1127
+mem/0: location 1130 is 1064
+mem/0: storing 30 in location 1131
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1125 is 0
+mem/0: location 1129 is 0
 run/0: ingredient 1 is capacity
-mem/0: location 1127 is 30
+mem/0: location 1131 is 30
 run/0: product 0 is 0
-mem/0: storing 0 in location 1128
+mem/0: storing 0 in location 1132
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1128 is 0
+mem/0: location 1132 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1096
+mem/0: storing 0 in location 1099
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1096 is 0
+mem/0: location 1099 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1094 is 1060
+mem/0: location 1097 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1097
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1100
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1094 is 1060
+mem/0: location 1097 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1098
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1101
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1098 is 1062
+mem/0: location 1101 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1097 is 1060
-mem/0: location 1060 is 0
-run/0: address to copy is 1063
-run/0: product 0 is 1063
-mem/0: storing 1063 in location 1099
+mem/0: location 1100 is 1062
+mem/0: location 1062 is 0
+run/0: address to copy is 1065
+run/0: product 0 is 1065
+mem/0: storing 1065 in location 1102
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1095 is 49
-mem/0: location 1099 is 1063
-mem/0: storing 49 in location 1063
+mem/0: location 1098 is 49
+mem/0: location 1102 is 1065
+mem/0: storing 49 in location 1065
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1097 is 1060
-mem/0: location 1060 is 0
+mem/0: location 1100 is 1062
+mem/0: location 1062 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1097 is 1060
-mem/0: storing 1 in location 1060
+mem/0: location 1100 is 1062
+mem/0: storing 1 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1094 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1097 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/22
 run/0: loop {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
@@ -275,147 +275,147 @@ run/0: ingredient 0 is 1
 run/0: jump-unless fell through
 run/0: instruction integer-to-decimal-string/26
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- buffer-append {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]}, {name: "45", value: 45, type: 0, properties: ["45": "literal"]}
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1152
+mem/0: new alloc: 1157
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1154
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1159
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 45
-mem/0: storing 45 in location 1155
+mem/0: storing 45 in location 1160
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1154 is 1060
+mem/0: location 1159 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1182
+mem/0: new alloc: 1188
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1184
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1190
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1184 is 1060
+mem/0: location 1190 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 1
+mem/0: location 1062 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1185
+mem/0: storing 1 in location 1191
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1184 is 1060
+mem/0: location 1190 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1186
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1192
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1186 is 1062
-mem/0: storing 30 in location 1187
+mem/0: location 1192 is 1064
+mem/0: storing 30 in location 1193
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1185 is 1
+mem/0: location 1191 is 1
 run/0: ingredient 1 is capacity
-mem/0: location 1187 is 30
+mem/0: location 1193 is 30
 run/0: product 0 is 0
-mem/0: storing 0 in location 1188
+mem/0: storing 0 in location 1194
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1188 is 0
+mem/0: location 1194 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1156
+mem/0: storing 0 in location 1161
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1156 is 0
+mem/0: location 1161 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1154 is 1060
+mem/0: location 1159 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1157
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1162
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1154 is 1060
+mem/0: location 1159 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1158
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1163
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1158 is 1062
+mem/0: location 1163 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1157 is 1060
-mem/0: location 1060 is 1
-run/0: address to copy is 1064
-run/0: product 0 is 1064
-mem/0: storing 1064 in location 1159
+mem/0: location 1162 is 1062
+mem/0: location 1062 is 1
+run/0: address to copy is 1066
+run/0: product 0 is 1066
+mem/0: storing 1066 in location 1164
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1155 is 45
-mem/0: location 1159 is 1064
-mem/0: storing 45 in location 1064
+mem/0: location 1160 is 45
+mem/0: location 1164 is 1066
+mem/0: storing 45 in location 1066
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1157 is 1060
-mem/0: location 1060 is 1
+mem/0: location 1162 is 1062
+mem/0: location 1062 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: location 1157 is 1060
-mem/0: storing 2 in location 1060
+mem/0: location 1162 is 1062
+mem/0: storing 2 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1154 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1159 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/28
 run/0: {name: "len", value: 10, type: 1, properties: ["len": "integer"]} <- get {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 2
+mem/0: location 1062 is 2
 run/0: product 0 is 2
 mem/0: storing 2 in location 1011
 run/0: instruction integer-to-decimal-string/29
 run/0: {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1012
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1012
 run/0: instruction integer-to-decimal-string/30
 run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "len", value: 10, type: 1, properties: ["len": "integer"]}
 mem/0: location 1011 is 2
 mem/0: array size is 2
-mem/0: new alloc: 1212
-mem/0: storing 1212 in location 1003
+mem/0: new alloc: 1219
+mem/0: storing 1219 in location 1003
 run/0: instruction integer-to-decimal-string/31
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "len", value: 10, type: 1, properties: ["len": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
@@ -442,29 +442,29 @@ run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
 run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
-mem/0: location 1012 is 1062
+mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 mem/0: location 1013 is 1
-run/0: address to copy is 1064
+run/0: address to copy is 1066
 run/0: its type is 4
-mem/0: location 1064 is 45
+mem/0: location 1066 is 45
 run/0: product 0 is 45
 mem/0: storing 45 in location 1015
 run/0: instruction integer-to-decimal-string/37
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1003 is 1212
+mem/0: location 1003 is 1219
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 mem/0: location 1014 is 0
-run/0: address to copy is 1213
-run/0: product 0 is 1213
-mem/0: storing 1213 in location 1016
+run/0: address to copy is 1220
+run/0: product 0 is 1220
+mem/0: storing 1220 in location 1016
 run/0: instruction integer-to-decimal-string/38
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 14, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
 mem/0: location 1015 is 45
-mem/0: location 1016 is 1213
-mem/0: storing 45 in location 1213
+mem/0: location 1016 is 1220
+mem/0: storing 45 in location 1220
 run/0: instruction integer-to-decimal-string/39
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "i", value: 12, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -498,29 +498,29 @@ run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
 run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
-mem/0: location 1012 is 1062
+mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 mem/0: location 1013 is 0
-run/0: address to copy is 1063
+run/0: address to copy is 1065
 run/0: its type is 4
-mem/0: location 1063 is 49
+mem/0: location 1065 is 49
 run/0: product 0 is 49
 mem/0: storing 49 in location 1015
 run/0: instruction integer-to-decimal-string/37
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1003 is 1212
+mem/0: location 1003 is 1219
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 mem/0: location 1014 is 1
-run/0: address to copy is 1214
-run/0: product 0 is 1214
-mem/0: storing 1214 in location 1016
+run/0: address to copy is 1221
+run/0: product 0 is 1221
+mem/0: storing 1221 in location 1016
 run/0: instruction integer-to-decimal-string/38
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 14, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
 mem/0: location 1015 is 49
-mem/0: location 1016 is 1214
-mem/0: storing 49 in location 1214
+mem/0: location 1016 is 1221
+mem/0: storing 49 in location 1221
 run/0: instruction integer-to-decimal-string/39
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "i", value: 12, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -554,16 +554,16 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 42
 run/0: instruction integer-to-decimal-string/43
 run/0: reply {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1003 is 1212
-run/0: result 0 is 1212
-mem/0: storing 1212 in location 1
+mem/0: location 1003 is 1219
+run/0: result 0 is 1219
+mem/0: storing 1219 in location 1
 run/0: instruction test-integer-to-decimal-digit-negative/1
 run/0: {name: "2", value: 2, type: 5-4, properties: ["2": "array":"character", "raw": ]} <- copy {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1212
-mem/0: location 1212 is 2
-mem/0: location 1213 is 45
-mem/0: location 1214 is 49
+mem/0: location 1 is 1219
+mem/0: location 1219 is 2
+mem/0: location 1220 is 45
+mem/0: location 1221 is 49
 mem/0: storing 2 in location 2
 mem/0: storing 45 in location 3
 mem/0: storing 49 in location 4
diff --git a/cpp/.traces/integer-to-decimal-digit-positive b/cpp/.traces/integer-to-decimal-digit-positive
index 7239ec92..df2d858d 100644
--- a/cpp/.traces/integer-to-decimal-digit-positive
+++ b/cpp/.traces/integer-to-decimal-digit-positive
@@ -47,48 +47,48 @@ run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"
 run/0: instruction init-buffer/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1030
+mem/0: new alloc: 1031
 run/0: instruction init-buffer/1
 run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]}
-mem/0: new alloc: 1060
-mem/0: storing 1060 in location 1032
+mem/0: new alloc: 1062
+mem/0: storing 1062 in location 1033
 run/0: instruction init-buffer/2
 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1032 is 1060
+mem/0: location 1033 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1033
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1034
 run/0: instruction init-buffer/3
 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: location 1033 is 1060
-mem/0: storing 0 in location 1060
+mem/0: location 1034 is 1062
+mem/0: storing 0 in location 1062
 run/0: instruction init-buffer/4
 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is result
-mem/0: location 1032 is 1060
+mem/0: location 1033 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
-run/0: product 0 is 1061
-mem/0: storing 1061 in location 1034
+run/0: address to copy is 1063
+run/0: product 0 is 1063
+mem/0: storing 1063 in location 1035
 run/0: instruction init-buffer/5
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient 
 run/0: product 0 is 30
-mem/0: storing 30 in location 1035
+mem/0: storing 30 in location 1036
 run/0: instruction init-buffer/6
 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
-mem/0: location 1035 is 30
+mem/0: location 1036 is 30
 mem/0: array size is 30
-mem/0: new alloc: 1062
-mem/0: location 1034 is 1061
-mem/0: storing 1062 in location 1061
+mem/0: new alloc: 1064
+mem/0: location 1035 is 1063
+mem/0: storing 1064 in location 1063
 run/0: instruction init-buffer/7
 run/0: reply {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]}
-mem/0: location 1032 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1033 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/15
 run/0: {name: "digit-base", value: 6, type: 1, properties: ["digit-base": "integer"]} <- copy {name: "48", value: 48, type: 0, properties: ["48": "literal"]}
 run/0: ingredient 0 is 48
@@ -124,122 +124,122 @@ run/0: product 0 is 52
 mem/0: storing 52 in location 1010
 run/0: instruction integer-to-decimal-string/21
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- buffer-append {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]}, {name: "c", value: 9, type: 4, properties: ["c": "character"]}
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 mem/0: location 1010 is 52
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1092
+mem/0: new alloc: 1095
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1094
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1097
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 52
-mem/0: storing 52 in location 1095
+mem/0: storing 52 in location 1098
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1094 is 1060
+mem/0: location 1097 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1122
+mem/0: new alloc: 1126
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1124
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1128
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1124 is 1060
+mem/0: location 1128 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 0
+mem/0: location 1062 is 0
 run/0: product 0 is 0
-mem/0: storing 0 in location 1125
+mem/0: storing 0 in location 1129
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1124 is 1060
+mem/0: location 1128 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1126
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1130
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1126 is 1062
-mem/0: storing 30 in location 1127
+mem/0: location 1130 is 1064
+mem/0: storing 30 in location 1131
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1125 is 0
+mem/0: location 1129 is 0
 run/0: ingredient 1 is capacity
-mem/0: location 1127 is 30
+mem/0: location 1131 is 30
 run/0: product 0 is 0
-mem/0: storing 0 in location 1128
+mem/0: storing 0 in location 1132
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1128 is 0
+mem/0: location 1132 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1096
+mem/0: storing 0 in location 1099
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1096 is 0
+mem/0: location 1099 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1094 is 1060
+mem/0: location 1097 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1097
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1100
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1094 is 1060
+mem/0: location 1097 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1098
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1101
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1098 is 1062
+mem/0: location 1101 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1097 is 1060
-mem/0: location 1060 is 0
-run/0: address to copy is 1063
-run/0: product 0 is 1063
-mem/0: storing 1063 in location 1099
+mem/0: location 1100 is 1062
+mem/0: location 1062 is 0
+run/0: address to copy is 1065
+run/0: product 0 is 1065
+mem/0: storing 1065 in location 1102
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1095 is 52
-mem/0: location 1099 is 1063
-mem/0: storing 52 in location 1063
+mem/0: location 1098 is 52
+mem/0: location 1102 is 1065
+mem/0: storing 52 in location 1065
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1097 is 1060
-mem/0: location 1060 is 0
+mem/0: location 1100 is 1062
+mem/0: location 1062 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: location 1097 is 1060
-mem/0: storing 1 in location 1060
+mem/0: location 1100 is 1062
+mem/0: storing 1 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1094 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1097 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/22
 run/0: loop {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
@@ -275,122 +275,122 @@ run/0: product 0 is 51
 mem/0: storing 51 in location 1010
 run/0: instruction integer-to-decimal-string/21
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- buffer-append {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]}, {name: "c", value: 9, type: 4, properties: ["c": "character"]}
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 mem/0: location 1010 is 51
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1152
+mem/0: new alloc: 1157
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1154
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1159
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 51
-mem/0: storing 51 in location 1155
+mem/0: storing 51 in location 1160
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1154 is 1060
+mem/0: location 1159 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1182
+mem/0: new alloc: 1188
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1184
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1190
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1184 is 1060
+mem/0: location 1190 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 1
+mem/0: location 1062 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1185
+mem/0: storing 1 in location 1191
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1184 is 1060
+mem/0: location 1190 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1186
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1192
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1186 is 1062
-mem/0: storing 30 in location 1187
+mem/0: location 1192 is 1064
+mem/0: storing 30 in location 1193
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1185 is 1
+mem/0: location 1191 is 1
 run/0: ingredient 1 is capacity
-mem/0: location 1187 is 30
+mem/0: location 1193 is 30
 run/0: product 0 is 0
-mem/0: storing 0 in location 1188
+mem/0: storing 0 in location 1194
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1188 is 0
+mem/0: location 1194 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1156
+mem/0: storing 0 in location 1161
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1156 is 0
+mem/0: location 1161 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1154 is 1060
+mem/0: location 1159 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1157
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1162
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1154 is 1060
+mem/0: location 1159 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1158
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1163
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1158 is 1062
+mem/0: location 1163 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1157 is 1060
-mem/0: location 1060 is 1
-run/0: address to copy is 1064
-run/0: product 0 is 1064
-mem/0: storing 1064 in location 1159
+mem/0: location 1162 is 1062
+mem/0: location 1062 is 1
+run/0: address to copy is 1066
+run/0: product 0 is 1066
+mem/0: storing 1066 in location 1164
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1155 is 51
-mem/0: location 1159 is 1064
-mem/0: storing 51 in location 1064
+mem/0: location 1160 is 51
+mem/0: location 1164 is 1066
+mem/0: storing 51 in location 1066
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1157 is 1060
-mem/0: location 1060 is 1
+mem/0: location 1162 is 1062
+mem/0: location 1062 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: location 1157 is 1060
-mem/0: storing 2 in location 1060
+mem/0: location 1162 is 1062
+mem/0: storing 2 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1154 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1159 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/22
 run/0: loop {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
@@ -426,122 +426,122 @@ run/0: product 0 is 50
 mem/0: storing 50 in location 1010
 run/0: instruction integer-to-decimal-string/21
 run/0: {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]} <- buffer-append {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer"]}, {name: "c", value: 9, type: 4, properties: ["c": "character"]}
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 mem/0: location 1010 is 50
 run/0: instruction buffer-append/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1212
+mem/0: new alloc: 1219
 run/0: instruction buffer-append/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1214
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1221
 run/0: instruction buffer-append/2
 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
 run/0: product 0 is 50
-mem/0: storing 50 in location 1215
+mem/0: storing 50 in location 1222
 run/0: instruction buffer-append/4
 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full? {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]}
-mem/0: location 1214 is 1060
+mem/0: location 1221 is 1062
 run/0: instruction buffer-full?/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1242
+mem/0: new alloc: 1250
 run/0: instruction buffer-full?/1
 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient 
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1244
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1252
 run/0: instruction buffer-full?/2
 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1244 is 1060
+mem/0: location 1252 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 2
+mem/0: location 1062 is 2
 run/0: product 0 is 2
-mem/0: storing 2 in location 1245
+mem/0: storing 2 in location 1253
 run/0: instruction buffer-full?/3
 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1244 is 1060
+mem/0: location 1252 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1246
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1254
 run/0: instruction buffer-full?/4
 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}
-mem/0: location 1246 is 1062
-mem/0: storing 30 in location 1247
+mem/0: location 1254 is 1064
+mem/0: storing 30 in location 1255
 run/0: instruction buffer-full?/5
 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]}
 run/0: ingredient 0 is len
-mem/0: location 1245 is 2
+mem/0: location 1253 is 2
 run/0: ingredient 1 is capacity
-mem/0: location 1247 is 30
+mem/0: location 1255 is 30
 run/0: product 0 is 0
-mem/0: storing 0 in location 1248
+mem/0: storing 0 in location 1256
 run/0: instruction buffer-full?/6
 run/0: reply {name: "result", value: 5, type: 3, properties: ["result": "boolean"]}
-mem/0: location 1248 is 0
+mem/0: location 1256 is 0
 run/0: result 0 is 0
-mem/0: storing 0 in location 1216
+mem/0: storing 0 in location 1223
 run/0: instruction buffer-append/5
 run/0: break-unless {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1216 is 0
+mem/0: location 1223 is 0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 
 run/0: jumping to instruction 7
 run/0: instruction buffer-append/8
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1214 is 1060
+mem/0: location 1221 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
-run/0: product 0 is 1060
-mem/0: storing 1060 in location 1217
+run/0: address to copy is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1224
 run/0: instruction buffer-append/9
 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is in
-mem/0: location 1214 is 1060
+mem/0: location 1221 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1218
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1225
 run/0: instruction buffer-append/10
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
 run/0: ingredient 0 is s
-mem/0: location 1218 is 1062
+mem/0: location 1225 is 1064
 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
-mem/0: location 1217 is 1060
-mem/0: location 1060 is 2
-run/0: address to copy is 1065
-run/0: product 0 is 1065
-mem/0: storing 1065 in location 1219
+mem/0: location 1224 is 1062
+mem/0: location 1062 is 2
+run/0: address to copy is 1067
+run/0: product 0 is 1067
+mem/0: storing 1067 in location 1226
 run/0: instruction buffer-append/11
 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
 run/0: ingredient 0 is c
-mem/0: location 1215 is 50
-mem/0: location 1219 is 1065
-mem/0: storing 50 in location 1065
+mem/0: location 1222 is 50
+mem/0: location 1226 is 1067
+mem/0: storing 50 in location 1067
 run/0: instruction buffer-append/12
 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
-mem/0: location 1217 is 1060
-mem/0: location 1060 is 2
+mem/0: location 1224 is 1062
+mem/0: location 1062 is 2
 run/0: ingredient 1 is 1
 run/0: product 0 is 3
-mem/0: location 1217 is 1060
-mem/0: storing 3 in location 1060
+mem/0: location 1224 is 1062
+mem/0: storing 3 in location 1062
 run/0: instruction buffer-append/13
 run/0: reply {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]}
-mem/0: location 1214 is 1060
-run/0: result 0 is 1060
-mem/0: storing 1060 in location 1006
+mem/0: location 1221 is 1062
+run/0: result 0 is 1062
+mem/0: storing 1062 in location 1006
 run/0: instruction integer-to-decimal-string/22
 run/0: loop {name: "", value: -6, type: , properties: ["": ]}
 run/0: ingredient 0 is -6
@@ -568,29 +568,29 @@ run/0: jumping to instruction 27
 run/0: instruction integer-to-decimal-string/28
 run/0: {name: "len", value: 10, type: 1, properties: ["len": "integer"]} <- get {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 run/0: ingredient 1 is length
-run/0: address to copy is 1060
+run/0: address to copy is 1062
 run/0: its type is 1
-mem/0: location 1060 is 3
+mem/0: location 1062 is 3
 run/0: product 0 is 3
 mem/0: storing 3 in location 1011
 run/0: instruction integer-to-decimal-string/29
 run/0: {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get {name: "tmp", value: 5, type: 2-9, properties: ["tmp": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]}
 run/0: ingredient 0 is tmp
-mem/0: location 1006 is 1060
+mem/0: location 1006 is 1062
 run/0: ingredient 1 is data
-run/0: address to copy is 1061
+run/0: address to copy is 1063
 run/0: its type is 2
-mem/0: location 1061 is 1062
-run/0: product 0 is 1062
-mem/0: storing 1062 in location 1012
+mem/0: location 1063 is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1012
 run/0: instruction integer-to-decimal-string/30
 run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "len", value: 10, type: 1, properties: ["len": "integer"]}
 mem/0: location 1011 is 3
 mem/0: array size is 3
-mem/0: new alloc: 1272
-mem/0: storing 1272 in location 1003
+mem/0: new alloc: 1281
+mem/0: storing 1281 in location 1003
 run/0: instruction integer-to-decimal-string/31
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "len", value: 10, type: 1, properties: ["len": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is len
@@ -617,29 +617,29 @@ run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
 run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
-mem/0: location 1012 is 1062
+mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 mem/0: location 1013 is 2
-run/0: address to copy is 1065
+run/0: address to copy is 1067
 run/0: its type is 4
-mem/0: location 1065 is 50
+mem/0: location 1067 is 50
 run/0: product 0 is 50
 mem/0: storing 50 in location 1015
 run/0: instruction integer-to-decimal-string/37
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1003 is 1272
+mem/0: location 1003 is 1281
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 mem/0: location 1014 is 0
-run/0: address to copy is 1273
-run/0: product 0 is 1273
-mem/0: storing 1273 in location 1016
+run/0: address to copy is 1282
+run/0: product 0 is 1282
+mem/0: storing 1282 in location 1016
 run/0: instruction integer-to-decimal-string/38
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 14, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
 mem/0: location 1015 is 50
-mem/0: location 1016 is 1273
-mem/0: storing 50 in location 1273
+mem/0: location 1016 is 1282
+mem/0: storing 50 in location 1282
 run/0: instruction integer-to-decimal-string/39
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "i", value: 12, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -673,29 +673,29 @@ run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
 run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
-mem/0: location 1012 is 1062
+mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 mem/0: location 1013 is 1
-run/0: address to copy is 1064
+run/0: address to copy is 1066
 run/0: its type is 4
-mem/0: location 1064 is 51
+mem/0: location 1066 is 51
 run/0: product 0 is 51
 mem/0: storing 51 in location 1015
 run/0: instruction integer-to-decimal-string/37
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1003 is 1272
+mem/0: location 1003 is 1281
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 mem/0: location 1014 is 1
-run/0: address to copy is 1274
-run/0: product 0 is 1274
-mem/0: storing 1274 in location 1016
+run/0: address to copy is 1283
+run/0: product 0 is 1283
+mem/0: storing 1283 in location 1016
 run/0: instruction integer-to-decimal-string/38
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 14, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
 mem/0: location 1015 is 51
-mem/0: location 1016 is 1274
-mem/0: storing 51 in location 1274
+mem/0: location 1016 is 1283
+mem/0: storing 51 in location 1283
 run/0: instruction integer-to-decimal-string/39
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "i", value: 12, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -729,29 +729,29 @@ run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/36
 run/0: {name: "src", value: 14, type: 4, properties: ["src": "character"]} <- index {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "buf", value: 11, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
-mem/0: location 1012 is 1062
+mem/0: location 1012 is 1064
 run/0: ingredient 1 is {name: "i", value: 12, type: 1, properties: ["i": "integer"]}
 mem/0: location 1013 is 0
-run/0: address to copy is 1063
+run/0: address to copy is 1065
 run/0: its type is 4
-mem/0: location 1063 is 52
+mem/0: location 1065 is 52
 run/0: product 0 is 52
 mem/0: storing 52 in location 1015
 run/0: instruction integer-to-decimal-string/37
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character"]} <- index-address {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1003 is 1272
+mem/0: location 1003 is 1281
 run/0: ingredient 1 is {name: "j", value: 13, type: 1, properties: ["j": "integer"]}
 mem/0: location 1014 is 2
-run/0: address to copy is 1275
-run/0: product 0 is 1275
-mem/0: storing 1275 in location 1016
+run/0: address to copy is 1284
+run/0: product 0 is 1284
+mem/0: storing 1284 in location 1016
 run/0: instruction integer-to-decimal-string/38
 run/0: {name: "dest", value: 15, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy {name: "src", value: 14, type: 4, properties: ["src": "character"]}
 run/0: ingredient 0 is src
 mem/0: location 1015 is 52
-mem/0: location 1016 is 1275
-mem/0: storing 52 in location 1275
+mem/0: location 1016 is 1284
+mem/0: storing 52 in location 1284
 run/0: instruction integer-to-decimal-string/39
 run/0: {name: "i", value: 12, type: 1, properties: ["i": "integer"]} <- subtract {name: "i", value: 12, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -785,17 +785,17 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 42
 run/0: instruction integer-to-decimal-string/43
 run/0: reply {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1003 is 1272
-run/0: result 0 is 1272
-mem/0: storing 1272 in location 1
+mem/0: location 1003 is 1281
+run/0: result 0 is 1281
+mem/0: storing 1281 in location 1
 run/0: instruction test-integer-to-decimal-digit-positive/1
 run/0: {name: "2", value: 2, type: 5-4, properties: ["2": "array":"character", "raw": ]} <- copy {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1272
-mem/0: location 1272 is 3
-mem/0: location 1273 is 50
-mem/0: location 1274 is 51
-mem/0: location 1275 is 52
+mem/0: location 1 is 1281
+mem/0: location 1281 is 3
+mem/0: location 1282 is 50
+mem/0: location 1283 is 51
+mem/0: location 1284 is 52
 mem/0: storing 3 in location 2
 mem/0: storing 50 in location 3
 mem/0: storing 51 in location 4
diff --git a/cpp/.traces/integer-to-decimal-digit-zero b/cpp/.traces/integer-to-decimal-digit-zero
index 16b62e31..e80db30e 100644
--- a/cpp/.traces/integer-to-decimal-digit-zero
+++ b/cpp/.traces/integer-to-decimal-digit-zero
@@ -26,17 +26,17 @@ run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction integer-to-decimal-string/4
 run/0: {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "0", value: 0, type: 0, properties: ["0": "literal-string"]}
-mem/0: storing 1030 in location 1003
+mem/0: storing 1031 in location 1003
 run/0: instruction integer-to-decimal-string/5
 run/0: reply {name: "result", value: 2, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1003 is 1030
-run/0: result 0 is 1030
-mem/0: storing 1030 in location 1
+mem/0: location 1003 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
 run/0: instruction test-integer-to-decimal-digit-zero/1
 run/0: {name: "2", value: 2, type: 5-4, properties: ["2": "array":"character", "raw": ]} <- copy {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
 run/0: ingredient 0 is 1
-mem/0: location 1 is 1030
-mem/0: location 1030 is 1
-mem/0: location 1031 is 48
+mem/0: location 1 is 1031
+mem/0: location 1031 is 1
+mem/0: location 1032 is 48
 mem/0: storing 1 in location 2
 mem/0: storing 48 in location 3
diff --git a/cpp/.traces/interpolate-at-end b/cpp/.traces/interpolate-at-end
index 2ea86fe0..35fc4746 100644
--- a/cpp/.traces/interpolate-at-end
+++ b/cpp/.traces/interpolate-at-end
@@ -98,8 +98,8 @@ run/0: instruction interpolate/14
 run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1017 is 10
 mem/0: array size is 10
-mem/0: new alloc: 1073
-mem/0: storing 1073 in location 1021
+mem/0: new alloc: 1074
+mem/0: storing 1074 in location 1021
 run/0: instruction interpolate/15
 run/0: {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
@@ -157,18 +157,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 0
-run/0: address to copy is 1074
-run/0: product 0 is 1074
-mem/0: storing 1074 in location 1027
+run/0: address to copy is 1075
+run/0: product 0 is 1075
+mem/0: storing 1075 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 104
-mem/0: location 1027 is 1074
-mem/0: storing 104 in location 1074
+mem/0: location 1027 is 1075
+mem/0: storing 104 in location 1075
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -226,18 +226,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 1
-run/0: address to copy is 1075
-run/0: product 0 is 1075
-mem/0: storing 1075 in location 1027
+run/0: address to copy is 1076
+run/0: product 0 is 1076
+mem/0: storing 1076 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 101
-mem/0: location 1027 is 1075
-mem/0: storing 101 in location 1075
+mem/0: location 1027 is 1076
+mem/0: storing 101 in location 1076
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -295,18 +295,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 2
-run/0: address to copy is 1076
-run/0: product 0 is 1076
-mem/0: storing 1076 in location 1027
+run/0: address to copy is 1077
+run/0: product 0 is 1077
+mem/0: storing 1077 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 108
-mem/0: location 1027 is 1076
-mem/0: storing 108 in location 1076
+mem/0: location 1027 is 1077
+mem/0: storing 108 in location 1077
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -364,18 +364,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 3
-run/0: address to copy is 1077
-run/0: product 0 is 1077
-mem/0: storing 1077 in location 1027
+run/0: address to copy is 1078
+run/0: product 0 is 1078
+mem/0: storing 1078 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 108
-mem/0: location 1027 is 1077
-mem/0: storing 108 in location 1077
+mem/0: location 1027 is 1078
+mem/0: storing 108 in location 1078
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -433,18 +433,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 4
-run/0: address to copy is 1078
-run/0: product 0 is 1078
-mem/0: storing 1078 in location 1027
+run/0: address to copy is 1079
+run/0: product 0 is 1079
+mem/0: storing 1079 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 111
-mem/0: location 1027 is 1078
-mem/0: storing 111 in location 1078
+mem/0: location 1027 is 1079
+mem/0: storing 111 in location 1079
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -502,18 +502,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 5
-run/0: address to copy is 1079
-run/0: product 0 is 1079
-mem/0: storing 1079 in location 1027
+run/0: address to copy is 1080
+run/0: product 0 is 1080
+mem/0: storing 1080 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 44
-mem/0: location 1027 is 1079
-mem/0: storing 44 in location 1079
+mem/0: location 1027 is 1080
+mem/0: storing 44 in location 1080
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -571,18 +571,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 6
-run/0: address to copy is 1080
-run/0: product 0 is 1080
-mem/0: storing 1080 in location 1027
+run/0: address to copy is 1081
+run/0: product 0 is 1081
+mem/0: storing 1081 in location 1027
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 32
-mem/0: location 1027 is 1080
-mem/0: storing 32 in location 1080
+mem/0: location 1027 is 1081
+mem/0: storing 32 in location 1081
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -669,18 +669,18 @@ mem/0: storing 97 in location 1025
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 7
-run/0: address to copy is 1081
-run/0: product 0 is 1081
-mem/0: storing 1081 in location 1027
+run/0: address to copy is 1082
+run/0: product 0 is 1082
+mem/0: storing 1082 in location 1027
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 97
-mem/0: location 1027 is 1081
-mem/0: storing 97 in location 1081
+mem/0: location 1027 is 1082
+mem/0: storing 97 in location 1082
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -726,18 +726,18 @@ mem/0: storing 98 in location 1025
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 8
-run/0: address to copy is 1082
-run/0: product 0 is 1082
-mem/0: storing 1082 in location 1027
+run/0: address to copy is 1083
+run/0: product 0 is 1083
+mem/0: storing 1083 in location 1027
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 98
-mem/0: location 1027 is 1082
-mem/0: storing 98 in location 1082
+mem/0: location 1027 is 1083
+mem/0: storing 98 in location 1083
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -783,18 +783,18 @@ mem/0: storing 99 in location 1025
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1021 is 1073
+mem/0: location 1021 is 1074
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1022 is 9
-run/0: address to copy is 1083
-run/0: product 0 is 1083
-mem/0: storing 1083 in location 1027
+run/0: address to copy is 1084
+run/0: product 0 is 1084
+mem/0: storing 1084 in location 1027
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1025 is 99
-mem/0: location 1027 is 1083
-mem/0: storing 99 in location 1083
+mem/0: location 1027 is 1084
+mem/0: storing 99 in location 1084
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -863,24 +863,24 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 55
 run/0: instruction interpolate/56
 run/0: reply {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1021 is 1073
-run/0: result 0 is 1073
-mem/0: storing 1073 in location 3
+mem/0: location 1021 is 1074
+run/0: result 0 is 1074
+mem/0: storing 1074 in location 3
 run/0: instruction test-interpolate-at-end/3
 run/0: {name: "4", value: 4, type: 5-4, properties: ["4": "array":"character", "raw": ]} <- copy {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 run/0: ingredient 0 is 3
-mem/0: location 3 is 1073
-mem/0: location 1073 is 10
-mem/0: location 1074 is 104
-mem/0: location 1075 is 101
-mem/0: location 1076 is 108
+mem/0: location 3 is 1074
+mem/0: location 1074 is 10
+mem/0: location 1075 is 104
+mem/0: location 1076 is 101
 mem/0: location 1077 is 108
-mem/0: location 1078 is 111
-mem/0: location 1079 is 44
-mem/0: location 1080 is 32
-mem/0: location 1081 is 97
-mem/0: location 1082 is 98
-mem/0: location 1083 is 99
+mem/0: location 1078 is 108
+mem/0: location 1079 is 111
+mem/0: location 1080 is 44
+mem/0: location 1081 is 32
+mem/0: location 1082 is 97
+mem/0: location 1083 is 98
+mem/0: location 1084 is 99
 mem/0: storing 10 in location 4
 mem/0: storing 104 in location 5
 mem/0: storing 101 in location 6
diff --git a/cpp/.traces/interpolate-at-start b/cpp/.traces/interpolate-at-start
index 75c4420b..47c1d8c0 100644
--- a/cpp/.traces/interpolate-at-start
+++ b/cpp/.traces/interpolate-at-start
@@ -98,8 +98,8 @@ run/0: instruction interpolate/14
 run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1018 is 11
 mem/0: array size is 11
-mem/0: new alloc: 1074
-mem/0: storing 1074 in location 1022
+mem/0: new alloc: 1075
+mem/0: storing 1075 in location 1022
 run/0: instruction interpolate/15
 run/0: {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
@@ -186,18 +186,18 @@ mem/0: storing 97 in location 1026
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 0
-run/0: address to copy is 1075
-run/0: product 0 is 1075
-mem/0: storing 1075 in location 1028
+run/0: address to copy is 1076
+run/0: product 0 is 1076
+mem/0: storing 1076 in location 1028
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 97
-mem/0: location 1028 is 1075
-mem/0: storing 97 in location 1075
+mem/0: location 1028 is 1076
+mem/0: storing 97 in location 1076
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -243,18 +243,18 @@ mem/0: storing 98 in location 1026
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 1
-run/0: address to copy is 1076
-run/0: product 0 is 1076
-mem/0: storing 1076 in location 1028
+run/0: address to copy is 1077
+run/0: product 0 is 1077
+mem/0: storing 1077 in location 1028
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 98
-mem/0: location 1028 is 1076
-mem/0: storing 98 in location 1076
+mem/0: location 1028 is 1077
+mem/0: storing 98 in location 1077
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -300,18 +300,18 @@ mem/0: storing 99 in location 1026
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 2
-run/0: address to copy is 1077
-run/0: product 0 is 1077
-mem/0: storing 1077 in location 1028
+run/0: address to copy is 1078
+run/0: product 0 is 1078
+mem/0: storing 1078 in location 1028
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 99
-mem/0: location 1028 is 1077
-mem/0: storing 99 in location 1077
+mem/0: location 1028 is 1078
+mem/0: storing 99 in location 1078
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -391,18 +391,18 @@ mem/0: storing 44 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 3
-run/0: address to copy is 1078
-run/0: product 0 is 1078
-mem/0: storing 1078 in location 1028
+run/0: address to copy is 1079
+run/0: product 0 is 1079
+mem/0: storing 1079 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 44
-mem/0: location 1028 is 1078
-mem/0: storing 44 in location 1078
+mem/0: location 1028 is 1079
+mem/0: storing 44 in location 1079
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -448,18 +448,18 @@ mem/0: storing 32 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 4
-run/0: address to copy is 1079
-run/0: product 0 is 1079
-mem/0: storing 1079 in location 1028
+run/0: address to copy is 1080
+run/0: product 0 is 1080
+mem/0: storing 1080 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 32
-mem/0: location 1028 is 1079
-mem/0: storing 32 in location 1079
+mem/0: location 1028 is 1080
+mem/0: storing 32 in location 1080
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -505,18 +505,18 @@ mem/0: storing 104 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 5
-run/0: address to copy is 1080
-run/0: product 0 is 1080
-mem/0: storing 1080 in location 1028
+run/0: address to copy is 1081
+run/0: product 0 is 1081
+mem/0: storing 1081 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 104
-mem/0: location 1028 is 1080
-mem/0: storing 104 in location 1080
+mem/0: location 1028 is 1081
+mem/0: storing 104 in location 1081
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -562,18 +562,18 @@ mem/0: storing 101 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 6
-run/0: address to copy is 1081
-run/0: product 0 is 1081
-mem/0: storing 1081 in location 1028
+run/0: address to copy is 1082
+run/0: product 0 is 1082
+mem/0: storing 1082 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 101
-mem/0: location 1028 is 1081
-mem/0: storing 101 in location 1081
+mem/0: location 1028 is 1082
+mem/0: storing 101 in location 1082
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -619,18 +619,18 @@ mem/0: storing 108 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 7
-run/0: address to copy is 1082
-run/0: product 0 is 1082
-mem/0: storing 1082 in location 1028
+run/0: address to copy is 1083
+run/0: product 0 is 1083
+mem/0: storing 1083 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 108
-mem/0: location 1028 is 1082
-mem/0: storing 108 in location 1082
+mem/0: location 1028 is 1083
+mem/0: storing 108 in location 1083
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -676,18 +676,18 @@ mem/0: storing 108 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 8
-run/0: address to copy is 1083
-run/0: product 0 is 1083
-mem/0: storing 1083 in location 1028
+run/0: address to copy is 1084
+run/0: product 0 is 1084
+mem/0: storing 1084 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 108
-mem/0: location 1028 is 1083
-mem/0: storing 108 in location 1083
+mem/0: location 1028 is 1084
+mem/0: storing 108 in location 1084
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -733,18 +733,18 @@ mem/0: storing 111 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 9
-run/0: address to copy is 1084
-run/0: product 0 is 1084
-mem/0: storing 1084 in location 1028
+run/0: address to copy is 1085
+run/0: product 0 is 1085
+mem/0: storing 1085 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 111
-mem/0: location 1028 is 1084
-mem/0: storing 111 in location 1084
+mem/0: location 1028 is 1085
+mem/0: storing 111 in location 1085
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -790,18 +790,18 @@ mem/0: storing 33 in location 1026
 run/0: instruction interpolate/50
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1074
+mem/0: location 1022 is 1075
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 10
-run/0: address to copy is 1085
-run/0: product 0 is 1085
-mem/0: storing 1085 in location 1028
+run/0: address to copy is 1086
+run/0: product 0 is 1086
+mem/0: storing 1086 in location 1028
 run/0: instruction interpolate/51
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1026 is 33
-mem/0: location 1028 is 1085
-mem/0: storing 33 in location 1085
+mem/0: location 1028 is 1086
+mem/0: storing 33 in location 1086
 run/0: instruction interpolate/52
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -836,25 +836,25 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 55
 run/0: instruction interpolate/56
 run/0: reply {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1022 is 1074
-run/0: result 0 is 1074
-mem/0: storing 1074 in location 3
+mem/0: location 1022 is 1075
+run/0: result 0 is 1075
+mem/0: storing 1075 in location 3
 run/0: instruction test-interpolate-at-start/3
 run/0: {name: "4", value: 4, type: 5-4, properties: ["4": "array":"character", "raw": ]} <- copy {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 run/0: ingredient 0 is 3
-mem/0: location 3 is 1074
-mem/0: location 1074 is 11
-mem/0: location 1075 is 97
-mem/0: location 1076 is 98
-mem/0: location 1077 is 99
-mem/0: location 1078 is 44
-mem/0: location 1079 is 32
-mem/0: location 1080 is 104
-mem/0: location 1081 is 101
-mem/0: location 1082 is 108
+mem/0: location 3 is 1075
+mem/0: location 1075 is 11
+mem/0: location 1076 is 97
+mem/0: location 1077 is 98
+mem/0: location 1078 is 99
+mem/0: location 1079 is 44
+mem/0: location 1080 is 32
+mem/0: location 1081 is 104
+mem/0: location 1082 is 101
 mem/0: location 1083 is 108
-mem/0: location 1084 is 111
-mem/0: location 1085 is 33
+mem/0: location 1084 is 108
+mem/0: location 1085 is 111
+mem/0: location 1086 is 33
 mem/0: storing 11 in location 4
 mem/0: storing 97 in location 5
 mem/0: storing 98 in location 6
diff --git a/cpp/.traces/interpolate-works b/cpp/.traces/interpolate-works
index e299c10a..c093cc14 100644
--- a/cpp/.traces/interpolate-works
+++ b/cpp/.traces/interpolate-works
@@ -98,8 +98,8 @@ run/0: instruction interpolate/14
 run/0: {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 3, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1014 is 7
 mem/0: array size is 7
-mem/0: new alloc: 1070
-mem/0: storing 1070 in location 1018
+mem/0: new alloc: 1071
+mem/0: storing 1071 in location 1018
 run/0: instruction interpolate/15
 run/0: {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
@@ -157,18 +157,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 0
-run/0: address to copy is 1071
-run/0: product 0 is 1071
-mem/0: storing 1071 in location 1024
+run/0: address to copy is 1072
+run/0: product 0 is 1072
+mem/0: storing 1072 in location 1024
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 97
-mem/0: location 1024 is 1071
-mem/0: storing 97 in location 1071
+mem/0: location 1024 is 1072
+mem/0: storing 97 in location 1072
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -226,18 +226,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 1
-run/0: address to copy is 1072
-run/0: product 0 is 1072
-mem/0: storing 1072 in location 1024
+run/0: address to copy is 1073
+run/0: product 0 is 1073
+mem/0: storing 1073 in location 1024
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 98
-mem/0: location 1024 is 1072
-mem/0: storing 98 in location 1072
+mem/0: location 1024 is 1073
+mem/0: storing 98 in location 1073
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -295,18 +295,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 2
-run/0: address to copy is 1073
-run/0: product 0 is 1073
-mem/0: storing 1073 in location 1024
+run/0: address to copy is 1074
+run/0: product 0 is 1074
+mem/0: storing 1074 in location 1024
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 99
-mem/0: location 1024 is 1073
-mem/0: storing 99 in location 1073
+mem/0: location 1024 is 1074
+mem/0: storing 99 in location 1074
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -364,18 +364,18 @@ run/0: jump-if fell through
 run/0: instruction interpolate/26
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 3
-run/0: address to copy is 1074
-run/0: product 0 is 1074
-mem/0: storing 1074 in location 1024
+run/0: address to copy is 1075
+run/0: product 0 is 1075
+mem/0: storing 1075 in location 1024
 run/0: instruction interpolate/27
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 32
-mem/0: location 1024 is 1074
-mem/0: storing 32 in location 1074
+mem/0: location 1024 is 1075
+mem/0: storing 32 in location 1075
 run/0: instruction interpolate/28
 run/0: {name: "i", value: 9, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 9, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -462,18 +462,18 @@ mem/0: storing 100 in location 1022
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 4
-run/0: address to copy is 1075
-run/0: product 0 is 1075
-mem/0: storing 1075 in location 1024
+run/0: address to copy is 1076
+run/0: product 0 is 1076
+mem/0: storing 1076 in location 1024
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 100
-mem/0: location 1024 is 1075
-mem/0: storing 100 in location 1075
+mem/0: location 1024 is 1076
+mem/0: storing 100 in location 1076
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -519,18 +519,18 @@ mem/0: storing 101 in location 1022
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 5
-run/0: address to copy is 1076
-run/0: product 0 is 1076
-mem/0: storing 1076 in location 1024
+run/0: address to copy is 1077
+run/0: product 0 is 1077
+mem/0: storing 1077 in location 1024
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 101
-mem/0: location 1024 is 1076
-mem/0: storing 101 in location 1076
+mem/0: location 1024 is 1077
+mem/0: storing 101 in location 1077
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -576,18 +576,18 @@ mem/0: storing 102 in location 1022
 run/0: instruction interpolate/37
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1018 is 1070
+mem/0: location 1018 is 1071
 run/0: ingredient 1 is {name: "result-idx", value: 8, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1019 is 6
-run/0: address to copy is 1077
-run/0: product 0 is 1077
-mem/0: storing 1077 in location 1024
+run/0: address to copy is 1078
+run/0: product 0 is 1078
+mem/0: storing 1078 in location 1024
 run/0: instruction interpolate/38
 run/0: {name: "out", value: 13, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1022 is 102
-mem/0: location 1024 is 1077
-mem/0: storing 102 in location 1077
+mem/0: location 1024 is 1078
+mem/0: storing 102 in location 1078
 run/0: instruction interpolate/39
 run/0: {name: "j", value: 14, type: 1, properties: ["j": "integer"]} <- add {name: "j", value: 14, type: 1, properties: ["j": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is j
@@ -656,21 +656,21 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 55
 run/0: instruction interpolate/56
 run/0: reply {name: "result", value: 7, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1018 is 1070
-run/0: result 0 is 1070
-mem/0: storing 1070 in location 3
+mem/0: location 1018 is 1071
+run/0: result 0 is 1071
+mem/0: storing 1071 in location 3
 run/0: instruction test-interpolate-works/3
 run/0: {name: "4", value: 4, type: 5-4, properties: ["4": "array":"character", "raw": ]} <- copy {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 run/0: ingredient 0 is 3
-mem/0: location 3 is 1070
-mem/0: location 1070 is 7
-mem/0: location 1071 is 97
-mem/0: location 1072 is 98
-mem/0: location 1073 is 99
-mem/0: location 1074 is 32
-mem/0: location 1075 is 100
-mem/0: location 1076 is 101
-mem/0: location 1077 is 102
+mem/0: location 3 is 1071
+mem/0: location 1071 is 7
+mem/0: location 1072 is 97
+mem/0: location 1073 is 98
+mem/0: location 1074 is 99
+mem/0: location 1075 is 32
+mem/0: location 1076 is 100
+mem/0: location 1077 is 101
+mem/0: location 1078 is 102
 mem/0: storing 7 in location 4
 mem/0: storing 97 in location 5
 mem/0: storing 98 in location 6
diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array
index 1cf28797..52919f13 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -24,13 +24,13 @@ mem/0: new alloc: 1000
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
 run/0: {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]} <- new {name: "integer", value: 1, type: 0, properties: ["integer": "type"]}
-mem/0: new alloc: 1005
-mem/0: storing 1005 in location 2
+mem/0: new alloc: 1006
+mem/0: storing 1006 in location 2
 run/0: instruction main/2
 run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer", "raw": ]} <- subtract {name: "2", value: 2, type: 2-1, properties: ["2": "address":"integer", "raw": ]}, {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]}
 run/0: ingredient 0 is 2
-mem/0: location 2 is 1005
+mem/0: location 2 is 1006
 run/0: ingredient 1 is 1
 mem/0: location 1 is 1000
-run/0: product 0 is 5
-mem/0: storing 5 in location 3
+run/0: product 0 is 6
+mem/0: storing 6 in location 3
diff --git a/cpp/.traces/parse_dollar_as_recipe_name b/cpp/.traces/parse_dollar_as_recipe_name
new file mode 100644
index 00000000..a73100d5
--- /dev/null
+++ b/cpp/.traces/parse_dollar_as_recipe_name
@@ -0,0 +1 @@
+parse/0: instruction: $foo
diff --git a/cpp/.traces/print-character-at-top-left b/cpp/.traces/print-character-at-top-left
new file mode 100644
index 00000000..65bf6f98
--- /dev/null
+++ b/cpp/.traces/print-character-at-top-left
@@ -0,0 +1,541 @@
+parse/0: instruction: init-fake-screen
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "width": ]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal", "height": ]}
+parse/0:   product: {name: "1", value: 0, type: 2-11, properties: ["1": "address":"screen"]}
+parse/0: instruction: print-character
+parse/0:   ingredient: {name: "1", value: 0, type: 2-11, properties: ["1": "address":"screen"]}
+parse/0:   ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-11, properties: ["1": "address":"screen"]}
+parse/0: instruction: get
+parse/0:   ingredient: {name: "1", value: 0, type: 2-11, properties: ["1": "address":"screen", "deref": ]}
+parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
+parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character"]}
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "deref": ]}
+parse/0:   product: {name: "3", value: 0, type: 5-4, properties: ["3": "array":"character"]}
+name/0: element data of type screen is at offset 4
+after-brace/0: recipe test-print-character-at-top-left
+after-brace/0: init-fake-screen ...
+after-brace/0: print-character ...
+after-brace/0: get ...
+after-brace/0: copy ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: test-print-character-at-top-left
+run/0: instruction test-print-character-at-top-left/0
+run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- init-fake-screen {name: "3", value: 3, type: 0, properties: ["3": "literal", "width": ]}, {name: "2", value: 2, type: 0, properties: ["2": "literal", "height": ]}
+run/0: instruction init-fake-screen/0
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal", "capacity": ]}
+mem/0: array size is 30
+mem/0: new alloc: 1000
+run/0: instruction init-fake-screen/1
+run/0: {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]} <- new {name: "screen", value: 11, type: 0, properties: ["screen": "type"]}
+mem/0: new alloc: 1031
+mem/0: storing 1031 in location 1002
+run/0: instruction init-fake-screen/2
+run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: ingredient 0 is result
+mem/0: location 1002 is 1031
+run/0: ingredient 1 is num-columns
+run/0: address to copy is 1032
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1003
+run/0: instruction init-fake-screen/3
+run/0: {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer", "deref": ]} <- next-ingredient 
+run/0: product 0 is 3
+mem/0: location 1003 is 1032
+mem/0: storing 3 in location 1032
+run/0: instruction init-fake-screen/4
+run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "num-rows", value: 0, type: 0, properties: ["num-rows": "offset"]}
+run/0: ingredient 0 is result
+mem/0: location 1002 is 1031
+run/0: ingredient 1 is num-rows
+run/0: address to copy is 1031
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1004
+run/0: instruction init-fake-screen/5
+run/0: {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer", "deref": ]} <- next-ingredient 
+run/0: product 0 is 2
+mem/0: location 1004 is 1031
+mem/0: storing 2 in location 1031
+run/0: instruction init-fake-screen/6
+run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: ingredient 0 is result
+mem/0: location 1002 is 1031
+run/0: ingredient 1 is cursor-row
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1005
+run/0: instruction init-fake-screen/7
+run/0: {name: "row", value: 4, type: 2-1, properties: ["row": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: location 1005 is 1033
+mem/0: storing 0 in location 1033
+run/0: instruction init-fake-screen/8
+run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer"]} <- get-address {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: ingredient 0 is result
+mem/0: location 1002 is 1031
+run/0: ingredient 1 is cursor-column
+run/0: address to copy is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1006
+run/0: instruction init-fake-screen/9
+run/0: {name: "column", value: 5, type: 2-1, properties: ["column": "address":"integer", "deref": ]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: location 1006 is 1034
+mem/0: storing 0 in location 1034
+run/0: instruction init-fake-screen/10
+run/0: {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]} <- multiply {name: "width", value: 2, type: 2-1, properties: ["width": "address":"integer", "deref": ]}, {name: "height", value: 3, type: 2-1, properties: ["height": "address":"integer", "deref": ]}
+run/0: ingredient 0 is width
+mem/0: location 1003 is 1032
+mem/0: location 1032 is 3
+run/0: ingredient 1 is height
+mem/0: location 1004 is 1031
+mem/0: location 1031 is 2
+run/0: ingredient 1 is 2
+run/0: product 0 is 6
+mem/0: storing 6 in location 1007
+run/0: instruction init-fake-screen/11
+run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character"]} <- get-address {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: ingredient 0 is result
+mem/0: location 1002 is 1031
+run/0: ingredient 1 is data
+run/0: address to copy is 1035
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1008
+run/0: instruction init-fake-screen/12
+run/0: {name: "buf", value: 7, type: 2-2-5-4, properties: ["buf": "address":"address":"array":"character", "deref": ]} <- new {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
+mem/0: location 1007 is 6
+mem/0: array size is 6
+mem/0: new alloc: 1036
+mem/0: location 1008 is 1035
+mem/0: storing 1036 in location 1035
+run/0: instruction init-fake-screen/13
+run/0: clear-screen {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
+mem/0: location 1002 is 1031
+run/0: instruction clear-screen/0
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+mem/0: array size is 30
+mem/0: new alloc: 1043
+run/0: instruction clear-screen/1
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient 
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1045
+run/0: instruction clear-screen/3
+run/0: break-unless {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: "", value: 12, type: , properties: ["": ]}
+mem/0: location 1045 is 1031
+run/0: ingredient 0 is 1031
+run/0: jump-unless fell through
+run/0: instruction clear-screen/4
+run/0: {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: ingredient 0 is x
+mem/0: location 1045 is 1031
+run/0: ingredient 1 is data
+run/0: address to copy is 1035
+run/0: its type is 2
+mem/0: location 1035 is 1036
+run/0: product 0 is 1036
+mem/0: storing 1036 in location 1046
+run/0: instruction clear-screen/5
+run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
+mem/0: location 1046 is 1036
+mem/0: storing 6 in location 1047
+run/0: instruction clear-screen/6
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1048
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 0
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction clear-screen/10
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1046 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1048 is 0
+run/0: address to copy is 1037
+run/0: product 0 is 1037
+mem/0: storing 1037 in location 1050
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1050 is 1037
+mem/0: storing 0 in location 1037
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1048
+run/0: instruction clear-screen/13
+run/0: loop {name: "", value: -6, type: , properties: ["": ]}
+run/0: ingredient 0 is -6
+run/0: jumping to instruction 8
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 1
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction clear-screen/10
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1046 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1048 is 1
+run/0: address to copy is 1038
+run/0: product 0 is 1038
+mem/0: storing 1038 in location 1050
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1050 is 1038
+mem/0: storing 0 in location 1038
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1048
+run/0: instruction clear-screen/13
+run/0: loop {name: "", value: -6, type: , properties: ["": ]}
+run/0: ingredient 0 is -6
+run/0: jumping to instruction 8
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 2
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction clear-screen/10
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1046 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1048 is 2
+run/0: address to copy is 1039
+run/0: product 0 is 1039
+mem/0: storing 1039 in location 1050
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1050 is 1039
+mem/0: storing 0 in location 1039
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1048
+run/0: instruction clear-screen/13
+run/0: loop {name: "", value: -6, type: , properties: ["": ]}
+run/0: ingredient 0 is -6
+run/0: jumping to instruction 8
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 3
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction clear-screen/10
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1046 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1048 is 3
+run/0: address to copy is 1040
+run/0: product 0 is 1040
+mem/0: storing 1040 in location 1050
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1050 is 1040
+mem/0: storing 0 in location 1040
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 4
+mem/0: storing 4 in location 1048
+run/0: instruction clear-screen/13
+run/0: loop {name: "", value: -6, type: , properties: ["": ]}
+run/0: ingredient 0 is -6
+run/0: jumping to instruction 8
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 4
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction clear-screen/10
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1046 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1048 is 4
+run/0: address to copy is 1041
+run/0: product 0 is 1041
+mem/0: storing 1041 in location 1050
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1050 is 1041
+mem/0: storing 0 in location 1041
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 4
+run/0: ingredient 1 is 1
+run/0: product 0 is 5
+mem/0: storing 5 in location 1048
+run/0: instruction clear-screen/13
+run/0: loop {name: "", value: -6, type: , properties: ["": ]}
+run/0: ingredient 0 is -6
+run/0: jumping to instruction 8
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 5
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction clear-screen/10
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character"]} <- index-address {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1046 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1048 is 5
+run/0: address to copy is 1042
+run/0: product 0 is 1042
+mem/0: storing 1042 in location 1050
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1050 is 1042
+mem/0: storing 0 in location 1042
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 5
+run/0: ingredient 1 is 1
+run/0: product 0 is 6
+mem/0: storing 6 in location 1048
+run/0: instruction clear-screen/13
+run/0: loop {name: "", value: -6, type: , properties: ["": ]}
+run/0: ingredient 0 is -6
+run/0: jumping to instruction 8
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 4, type: 1, properties: ["i": "integer"]}, {name: "max", value: 3, type: 1, properties: ["max": "integer"]}
+run/0: ingredient 0 is i
+mem/0: location 1048 is 6
+run/0: ingredient 1 is max
+mem/0: location 1047 is 6
+run/0: product 0 is 1
+mem/0: storing 1 in location 1049
+run/0: instruction clear-screen/9
+run/0: break-if {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1049 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 14
+run/0: instruction clear-screen/15
+run/0: reply {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+mem/0: location 1045 is 1031
+run/0: instruction init-fake-screen/14
+run/0: reply {name: "result", value: 1, type: 2-11, properties: ["result": "address":"screen"]}
+mem/0: location 1002 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
+run/0: instruction test-print-character-at-top-left/1
+run/0: {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]} <- print-character {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
+mem/0: location 1 is 1031
+run/0: instruction print-character/0
+run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
+mem/0: array size is 30
+mem/0: new alloc: 1074
+run/0: instruction print-character/1
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient 
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1076
+run/0: instruction print-character/2
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient 
+run/0: product 0 is 97
+mem/0: storing 97 in location 1077
+run/0: instruction print-character/4
+run/0: break-unless {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: "", value: 14, type: , properties: ["": ]}
+mem/0: location 1076 is 1031
+run/0: ingredient 0 is 1031
+run/0: jump-unless fell through
+run/0: instruction print-character/5
+run/0: {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer"]} <- get-address {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-row", value: 2, type: 0, properties: ["cursor-row": "offset"]}
+run/0: ingredient 0 is x
+mem/0: location 1076 is 1031
+run/0: ingredient 1 is cursor-row
+run/0: address to copy is 1033
+run/0: product 0 is 1033
+mem/0: storing 1033 in location 1078
+run/0: instruction print-character/6
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "cursor-column", value: 3, type: 0, properties: ["cursor-column": "offset"]}
+run/0: ingredient 0 is x
+mem/0: location 1076 is 1031
+run/0: ingredient 1 is cursor-column
+run/0: address to copy is 1034
+run/0: product 0 is 1034
+mem/0: storing 1034 in location 1079
+run/0: instruction print-character/7
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "num-columns", value: 1, type: 0, properties: ["num-columns": "offset"]}
+run/0: ingredient 0 is x
+mem/0: location 1076 is 1031
+run/0: ingredient 1 is num-columns
+run/0: address to copy is 1032
+run/0: its type is 1
+mem/0: location 1032 is 3
+run/0: product 0 is 3
+mem/0: storing 3 in location 1080
+run/0: instruction print-character/8
+run/0: {name: "index", value: 6, type: 1, properties: ["index": "integer"]} <- multiply {name: "row", value: 3, type: 2-1, properties: ["row": "address":"integer", "deref": ]}, {name: "width", value: 5, type: 1, properties: ["width": "integer"]}
+run/0: ingredient 0 is row
+mem/0: location 1078 is 1033
+mem/0: location 1033 is 0
+run/0: ingredient 1 is width
+mem/0: location 1080 is 3
+run/0: ingredient 1 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1081
+run/0: instruction print-character/9
+run/0: {name: "index", value: 6, type: 1, properties: ["index": "integer"]} <- add {name: "index", value: 6, type: 1, properties: ["index": "integer"]}, {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer", "deref": ]}
+run/0: ingredient 0 is index
+mem/0: location 1081 is 0
+run/0: ingredient 1 is column
+mem/0: location 1079 is 1034
+mem/0: location 1034 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1081
+run/0: instruction print-character/10
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: ingredient 0 is x
+mem/0: location 1076 is 1031
+run/0: ingredient 1 is data
+run/0: address to copy is 1035
+run/0: its type is 2
+mem/0: location 1035 is 1036
+run/0: product 0 is 1036
+mem/0: storing 1036 in location 1082
+run/0: instruction print-character/11
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}, {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+run/0: ingredient 0 is buf
+mem/0: location 1082 is 1036
+run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+mem/0: location 1081 is 0
+run/0: address to copy is 1037
+run/0: product 0 is 1037
+mem/0: storing 1037 in location 1083
+run/0: instruction print-character/12
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character", "deref": ]} <- copy {name: "c", value: 2, type: 4, properties: ["c": "character"]}
+run/0: ingredient 0 is c
+mem/0: location 1077 is 97
+mem/0: location 1083 is 1037
+mem/0: storing 97 in location 1037
+run/0: instruction print-character/14
+run/0: {name: "at-right?", value: 9, type: 3, properties: ["at-right?": "boolean"]} <- equal {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer", "deref": ]}, {name: "width", value: 5, type: 1, properties: ["width": "integer"]}
+run/0: ingredient 0 is column
+mem/0: location 1079 is 1034
+mem/0: location 1034 is 0
+run/0: ingredient 1 is width
+mem/0: location 1080 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1084
+run/0: instruction print-character/15
+run/0: break-if {name: "at-right?", value: 9, type: 3, properties: ["at-right?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
+mem/0: location 1084 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction print-character/16
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer", "deref": ]} <- add {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: ingredient 0 is column
+mem/0: location 1079 is 1034
+mem/0: location 1034 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: location 1079 is 1034
+mem/0: storing 1 in location 1034
+run/0: instruction print-character/18
+run/0: reply {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+mem/0: location 1076 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 1
+run/0: instruction test-print-character-at-top-left/2
+run/0: {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character"]} <- get {name: "1", value: 1, type: 2-11, properties: ["1": "address":"screen", "deref": ]}, {name: "data", value: 4, type: 0, properties: ["data": "offset"]}
+run/0: ingredient 0 is 1
+mem/0: location 1 is 1031
+run/0: ingredient 1 is data
+run/0: address to copy is 1035
+run/0: its type is 2
+mem/0: location 1035 is 1036
+run/0: product 0 is 1036
+mem/0: storing 1036 in location 2
+run/0: instruction test-print-character-at-top-left/3
+run/0: {name: "3", value: 3, type: 5-4, properties: ["3": "array":"character"]} <- copy {name: "2", value: 2, type: 2-5-4, properties: ["2": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is 2
+mem/0: location 2 is 1036
+mem/0: location 1036 is 6
+mem/0: location 1037 is 97
+mem/0: location 1038 is 0
+mem/0: location 1039 is 0
+mem/0: location 1040 is 0
+mem/0: location 1041 is 0
+mem/0: location 1042 is 0
+mem/0: storing 6 in location 3
+mem/0: storing 97 in location 4
+mem/0: storing 0 in location 5
+mem/0: storing 0 in location 6
+mem/0: storing 0 in location 7
+mem/0: storing 0 in location 8
+mem/0: storing 0 in location 9
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
index ce50ab28..16645ab7 100644
--- a/cpp/.traces/string-append-1
+++ b/cpp/.traces/string-append-1
@@ -62,8 +62,8 @@ run/0: instruction string-append/6
 run/0: {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character"]} <- new {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "result-len", value: 5, type: 1, properties: ["result-len": "integer"]}
 mem/0: location 1021 is 13
 mem/0: array size is 13
-mem/0: new alloc: 1045
-mem/0: storing 1045 in location 1022
+mem/0: new alloc: 1046
+mem/0: storing 1046 in location 1022
 run/0: instruction string-append/7
 run/0: {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
@@ -88,12 +88,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/12
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 0
-run/0: address to copy is 1046
-run/0: product 0 is 1046
-mem/0: storing 1046 in location 1026
+run/0: address to copy is 1047
+run/0: product 0 is 1047
+mem/0: storing 1047 in location 1026
 run/0: instruction string-append/13
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
@@ -109,8 +109,8 @@ run/0: instruction string-append/14
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 104
-mem/0: location 1026 is 1046
-mem/0: storing 104 in location 1046
+mem/0: location 1026 is 1047
+mem/0: storing 104 in location 1047
 run/0: instruction string-append/15
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -145,12 +145,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/12
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 1
-run/0: address to copy is 1047
-run/0: product 0 is 1047
-mem/0: storing 1047 in location 1026
+run/0: address to copy is 1048
+run/0: product 0 is 1048
+mem/0: storing 1048 in location 1026
 run/0: instruction string-append/13
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
@@ -166,8 +166,8 @@ run/0: instruction string-append/14
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 101
-mem/0: location 1026 is 1047
-mem/0: storing 101 in location 1047
+mem/0: location 1026 is 1048
+mem/0: storing 101 in location 1048
 run/0: instruction string-append/15
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -202,12 +202,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/12
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 2
-run/0: address to copy is 1048
-run/0: product 0 is 1048
-mem/0: storing 1048 in location 1026
+run/0: address to copy is 1049
+run/0: product 0 is 1049
+mem/0: storing 1049 in location 1026
 run/0: instruction string-append/13
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
@@ -223,8 +223,8 @@ run/0: instruction string-append/14
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 108
-mem/0: location 1026 is 1048
-mem/0: storing 108 in location 1048
+mem/0: location 1026 is 1049
+mem/0: storing 108 in location 1049
 run/0: instruction string-append/15
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -259,12 +259,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/12
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 3
-run/0: address to copy is 1049
-run/0: product 0 is 1049
-mem/0: storing 1049 in location 1026
+run/0: address to copy is 1050
+run/0: product 0 is 1050
+mem/0: storing 1050 in location 1026
 run/0: instruction string-append/13
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
@@ -280,8 +280,8 @@ run/0: instruction string-append/14
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 108
-mem/0: location 1026 is 1049
-mem/0: storing 108 in location 1049
+mem/0: location 1026 is 1050
+mem/0: storing 108 in location 1050
 run/0: instruction string-append/15
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -316,12 +316,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/12
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 4
-run/0: address to copy is 1050
-run/0: product 0 is 1050
-mem/0: storing 1050 in location 1026
+run/0: address to copy is 1051
+run/0: product 0 is 1051
+mem/0: storing 1051 in location 1026
 run/0: instruction string-append/13
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
@@ -337,8 +337,8 @@ run/0: instruction string-append/14
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 111
-mem/0: location 1026 is 1050
-mem/0: storing 111 in location 1050
+mem/0: location 1026 is 1051
+mem/0: storing 111 in location 1051
 run/0: instruction string-append/15
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -373,12 +373,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/12
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 5
-run/0: address to copy is 1051
-run/0: product 0 is 1051
-mem/0: storing 1051 in location 1026
+run/0: address to copy is 1052
+run/0: product 0 is 1052
+mem/0: storing 1052 in location 1026
 run/0: instruction string-append/13
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
@@ -394,8 +394,8 @@ run/0: instruction string-append/14
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 44
-mem/0: location 1026 is 1051
-mem/0: storing 44 in location 1051
+mem/0: location 1026 is 1052
+mem/0: storing 44 in location 1052
 run/0: instruction string-append/15
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -448,12 +448,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 6
-run/0: address to copy is 1052
-run/0: product 0 is 1052
-mem/0: storing 1052 in location 1026
+run/0: address to copy is 1053
+run/0: product 0 is 1053
+mem/0: storing 1053 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -469,8 +469,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 32
-mem/0: location 1026 is 1052
-mem/0: storing 32 in location 1052
+mem/0: location 1026 is 1053
+mem/0: storing 32 in location 1053
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -505,12 +505,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 7
-run/0: address to copy is 1053
-run/0: product 0 is 1053
-mem/0: storing 1053 in location 1026
+run/0: address to copy is 1054
+run/0: product 0 is 1054
+mem/0: storing 1054 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -526,8 +526,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 119
-mem/0: location 1026 is 1053
-mem/0: storing 119 in location 1053
+mem/0: location 1026 is 1054
+mem/0: storing 119 in location 1054
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -562,12 +562,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 8
-run/0: address to copy is 1054
-run/0: product 0 is 1054
-mem/0: storing 1054 in location 1026
+run/0: address to copy is 1055
+run/0: product 0 is 1055
+mem/0: storing 1055 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -583,8 +583,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 111
-mem/0: location 1026 is 1054
-mem/0: storing 111 in location 1054
+mem/0: location 1026 is 1055
+mem/0: storing 111 in location 1055
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -619,12 +619,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 9
-run/0: address to copy is 1055
-run/0: product 0 is 1055
-mem/0: storing 1055 in location 1026
+run/0: address to copy is 1056
+run/0: product 0 is 1056
+mem/0: storing 1056 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -640,8 +640,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 114
-mem/0: location 1026 is 1055
-mem/0: storing 114 in location 1055
+mem/0: location 1026 is 1056
+mem/0: storing 114 in location 1056
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -676,12 +676,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 10
-run/0: address to copy is 1056
-run/0: product 0 is 1056
-mem/0: storing 1056 in location 1026
+run/0: address to copy is 1057
+run/0: product 0 is 1057
+mem/0: storing 1057 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -697,8 +697,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 108
-mem/0: location 1026 is 1056
-mem/0: storing 108 in location 1056
+mem/0: location 1026 is 1057
+mem/0: storing 108 in location 1057
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -733,12 +733,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 11
-run/0: address to copy is 1057
-run/0: product 0 is 1057
-mem/0: storing 1057 in location 1026
+run/0: address to copy is 1058
+run/0: product 0 is 1058
+mem/0: storing 1058 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -754,8 +754,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 100
-mem/0: location 1026 is 1057
-mem/0: storing 100 in location 1057
+mem/0: location 1026 is 1058
+mem/0: storing 100 in location 1058
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -790,12 +790,12 @@ run/0: jump-if fell through
 run/0: instruction string-append/23
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character"]} <- index-address {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character", "deref": ]}, {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 run/0: ingredient 0 is result
-mem/0: location 1022 is 1045
+mem/0: location 1022 is 1046
 run/0: ingredient 1 is {name: "result-idx", value: 7, type: 1, properties: ["result-idx": "integer"]}
 mem/0: location 1023 is 12
-run/0: address to copy is 1058
-run/0: product 0 is 1058
-mem/0: storing 1058 in location 1026
+run/0: address to copy is 1059
+run/0: product 0 is 1059
+mem/0: storing 1059 in location 1026
 run/0: instruction string-append/24
 run/0: {name: "in", value: 11, type: 4, properties: ["in": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
@@ -811,8 +811,8 @@ run/0: instruction string-append/25
 run/0: {name: "out", value: 10, type: 2-4, properties: ["out": "address":"character", "deref": ]} <- copy {name: "in", value: 11, type: 4, properties: ["in": "character"]}
 run/0: ingredient 0 is in
 mem/0: location 1027 is 33
-mem/0: location 1026 is 1058
-mem/0: storing 33 in location 1058
+mem/0: location 1026 is 1059
+mem/0: storing 33 in location 1059
 run/0: instruction string-append/26
 run/0: {name: "i", value: 8, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 8, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
@@ -847,27 +847,27 @@ run/0: ingredient 1 is
 run/0: jumping to instruction 29
 run/0: instruction string-append/30
 run/0: reply {name: "result", value: 6, type: 2-5-4, properties: ["result": "address":"array":"character"]}
-mem/0: location 1022 is 1045
-run/0: result 0 is 1045
-mem/0: storing 1045 in location 3
+mem/0: location 1022 is 1046
+run/0: result 0 is 1046
+mem/0: storing 1046 in location 3
 run/0: instruction test-string-append-1/3
 run/0: {name: "4", value: 4, type: 5-4, properties: ["4": "array":"character", "raw": ]} <- copy {name: "3", value: 3, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 run/0: ingredient 0 is 3
-mem/0: location 3 is 1045
-mem/0: location 1045 is 13
-mem/0: location 1046 is 104
-mem/0: location 1047 is 101
-mem/0: location 1048 is 108
+mem/0: location 3 is 1046
+mem/0: location 1046 is 13
+mem/0: location 1047 is 104
+mem/0: location 1048 is 101
 mem/0: location 1049 is 108
-mem/0: location 1050 is 111
-mem/0: location 1051 is 44
-mem/0: location 1052 is 32
-mem/0: location 1053 is 119
-mem/0: location 1054 is 111
-mem/0: location 1055 is 114
-mem/0: location 1056 is 108
-mem/0: location 1057 is 100
-mem/0: location 1058 is 33
+mem/0: location 1050 is 108
+mem/0: location 1051 is 111
+mem/0: location 1052 is 44
+mem/0: location 1053 is 32
+mem/0: location 1054 is 119
+mem/0: location 1055 is 111
+mem/0: location 1056 is 114
+mem/0: location 1057 is 108
+mem/0: location 1058 is 100
+mem/0: location 1059 is 33
 mem/0: storing 13 in location 4
 mem/0: storing 104 in location 5
 mem/0: storing 101 in location 6
diff --git a/cpp/.traces/string-equal-common-lengths-but-distinct b/cpp/.traces/string-equal-common-lengths-but-distinct
index c74e78bf..82244da9 100644
--- a/cpp/.traces/string-equal-common-lengths-but-distinct
+++ b/cpp/.traces/string-equal-common-lengths-but-distinct
@@ -30,48 +30,48 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction test-string-equal-common-lengths-but-distinct/1
 run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-mem/0: storing 1030 in location 1002
+mem/0: storing 1031 in location 1002
 run/0: instruction test-string-equal-common-lengths-but-distinct/2
 run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
-mem/0: storing 1034 in location 1003
+mem/0: storing 1035 in location 1003
 run/0: instruction test-string-equal-common-lengths-but-distinct/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-mem/0: location 1002 is 1030
-mem/0: location 1003 is 1034
+mem/0: location 1002 is 1031
+mem/0: location 1003 is 1035
 run/0: instruction string-equal/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1038
+mem/0: new alloc: 1039
 run/0: instruction string-equal/1
 run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1040
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction string-equal/2
 run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
-mem/0: storing 3 in location 1041
+mem/0: location 1041 is 1031
+mem/0: storing 3 in location 1042
 run/0: instruction string-equal/3
 run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1042
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1043
 run/0: instruction string-equal/4
 run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
-mem/0: storing 3 in location 1043
+mem/0: location 1043 is 1035
+mem/0: storing 3 in location 1044
 run/0: instruction string-equal/6
 run/0: trace {name: "string-equal", value: 0, type: 0, properties: ["string-equal": "literal-string"]}, {name: "comparing lengths", value: 0, type: 0, properties: ["comparing lengths": "literal-string"]}
 string-equal/0: comparing lengths
 run/0: instruction string-equal/7
 run/0: {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]} <- equal {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}, {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]}
 run/0: ingredient 0 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: ingredient 1 is b-len
-mem/0: location 1043 is 3
+mem/0: location 1044 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1044
+mem/0: storing 1 in location 1045
 run/0: instruction string-equal/8
 run/0: break-if {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1044 is 1
+mem/0: location 1045 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 10
@@ -81,63 +81,63 @@ string-equal/0: comparing characters
 run/0: instruction string-equal/12
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1045
+mem/0: storing 0 in location 1046
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 0
+mem/0: location 1046 is 0
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1046
+mem/0: storing 0 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 0
-run/0: address to copy is 1031
+mem/0: location 1046 is 0
+run/0: address to copy is 1032
 run/0: its type is 4
-mem/0: location 1031 is 97
+mem/0: location 1032 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1047
+mem/0: storing 97 in location 1048
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
+mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 0
-run/0: address to copy is 1035
+mem/0: location 1046 is 0
+run/0: address to copy is 1036
 run/0: its type is 4
-mem/0: location 1035 is 97
+mem/0: location 1036 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1048
+mem/0: storing 97 in location 1049
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1047 is 97
-run/0: ingredient 1 is b2
 mem/0: location 1048 is 97
+run/0: ingredient 1 is b2
+mem/0: location 1049 is 97
 run/0: product 0 is 1
-mem/0: storing 1 in location 1049
+mem/0: storing 1 in location 1050
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1049 is 1
+mem/0: location 1050 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 0
+mem/0: location 1046 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1045
+mem/0: storing 1 in location 1046
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -145,59 +145,59 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1046
+mem/0: storing 0 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 1
-run/0: address to copy is 1032
+mem/0: location 1046 is 1
+run/0: address to copy is 1033
 run/0: its type is 4
-mem/0: location 1032 is 98
+mem/0: location 1033 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1047
+mem/0: storing 98 in location 1048
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
+mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 1
-run/0: address to copy is 1036
+mem/0: location 1046 is 1
+run/0: address to copy is 1037
 run/0: its type is 4
-mem/0: location 1036 is 98
+mem/0: location 1037 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1048
+mem/0: storing 98 in location 1049
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1047 is 98
-run/0: ingredient 1 is b2
 mem/0: location 1048 is 98
+run/0: ingredient 1 is b2
+mem/0: location 1049 is 98
 run/0: product 0 is 1
-mem/0: storing 1 in location 1049
+mem/0: storing 1 in location 1050
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1049 is 1
+mem/0: location 1050 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1045
+mem/0: storing 2 in location 1046
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -205,49 +205,49 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 2
+mem/0: location 1046 is 2
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1046
+mem/0: storing 0 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 2
-run/0: address to copy is 1033
+mem/0: location 1046 is 2
+run/0: address to copy is 1034
 run/0: its type is 4
-mem/0: location 1033 is 99
+mem/0: location 1034 is 99
 run/0: product 0 is 99
-mem/0: storing 99 in location 1047
+mem/0: storing 99 in location 1048
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
+mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 2
-run/0: address to copy is 1037
+mem/0: location 1046 is 2
+run/0: address to copy is 1038
 run/0: its type is 4
-mem/0: location 1037 is 100
+mem/0: location 1038 is 100
 run/0: product 0 is 100
-mem/0: storing 100 in location 1048
+mem/0: storing 100 in location 1049
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1047 is 99
+mem/0: location 1048 is 99
 run/0: ingredient 1 is b2
-mem/0: location 1048 is 100
+mem/0: location 1049 is 100
 run/0: product 0 is 0
-mem/0: storing 0 in location 1049
+mem/0: storing 0 in location 1050
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1049 is 0
+mem/0: location 1050 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/21
diff --git a/cpp/.traces/string-equal-distinct-lengths b/cpp/.traces/string-equal-distinct-lengths
index 22c4c754..72ff3a0c 100644
--- a/cpp/.traces/string-equal-distinct-lengths
+++ b/cpp/.traces/string-equal-distinct-lengths
@@ -30,48 +30,48 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction test-string-equal-distinct-lengths/1
 run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-mem/0: storing 1030 in location 1002
+mem/0: storing 1031 in location 1002
 run/0: instruction test-string-equal-distinct-lengths/2
 run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
-mem/0: storing 1034 in location 1003
+mem/0: storing 1035 in location 1003
 run/0: instruction test-string-equal-distinct-lengths/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-mem/0: location 1002 is 1030
-mem/0: location 1003 is 1034
+mem/0: location 1002 is 1031
+mem/0: location 1003 is 1035
 run/0: instruction string-equal/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1039
+mem/0: new alloc: 1040
 run/0: instruction string-equal/1
 run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1041
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1042
 run/0: instruction string-equal/2
 run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1041 is 1030
-mem/0: storing 3 in location 1042
+mem/0: location 1042 is 1031
+mem/0: storing 3 in location 1043
 run/0: instruction string-equal/3
 run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1043
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1044
 run/0: instruction string-equal/4
 run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1043 is 1034
-mem/0: storing 4 in location 1044
+mem/0: location 1044 is 1035
+mem/0: storing 4 in location 1045
 run/0: instruction string-equal/6
 run/0: trace {name: "string-equal", value: 0, type: 0, properties: ["string-equal": "literal-string"]}, {name: "comparing lengths", value: 0, type: 0, properties: ["comparing lengths": "literal-string"]}
 string-equal/0: comparing lengths
 run/0: instruction string-equal/7
 run/0: {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]} <- equal {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}, {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]}
 run/0: ingredient 0 is a-len
-mem/0: location 1042 is 3
+mem/0: location 1043 is 3
 run/0: ingredient 1 is b-len
-mem/0: location 1044 is 4
+mem/0: location 1045 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1045
+mem/0: storing 0 in location 1046
 run/0: instruction string-equal/8
 run/0: break-if {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 0
+mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/9
diff --git a/cpp/.traces/string-equal-identical b/cpp/.traces/string-equal-identical
index db4b3558..57f3afa8 100644
--- a/cpp/.traces/string-equal-identical
+++ b/cpp/.traces/string-equal-identical
@@ -30,48 +30,48 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction test-string-equal-identical/1
 run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-mem/0: storing 1030 in location 1002
+mem/0: storing 1031 in location 1002
 run/0: instruction test-string-equal-identical/2
 run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-mem/0: storing 1034 in location 1003
+mem/0: storing 1035 in location 1003
 run/0: instruction test-string-equal-identical/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-mem/0: location 1002 is 1030
-mem/0: location 1003 is 1034
+mem/0: location 1002 is 1031
+mem/0: location 1003 is 1035
 run/0: instruction string-equal/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1038
+mem/0: new alloc: 1039
 run/0: instruction string-equal/1
 run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1040
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1041
 run/0: instruction string-equal/2
 run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
-mem/0: storing 3 in location 1041
+mem/0: location 1041 is 1031
+mem/0: storing 3 in location 1042
 run/0: instruction string-equal/3
 run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1034
-mem/0: storing 1034 in location 1042
+run/0: product 0 is 1035
+mem/0: storing 1035 in location 1043
 run/0: instruction string-equal/4
 run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
-mem/0: storing 3 in location 1043
+mem/0: location 1043 is 1035
+mem/0: storing 3 in location 1044
 run/0: instruction string-equal/6
 run/0: trace {name: "string-equal", value: 0, type: 0, properties: ["string-equal": "literal-string"]}, {name: "comparing lengths", value: 0, type: 0, properties: ["comparing lengths": "literal-string"]}
 string-equal/0: comparing lengths
 run/0: instruction string-equal/7
 run/0: {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]} <- equal {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}, {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]}
 run/0: ingredient 0 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: ingredient 1 is b-len
-mem/0: location 1043 is 3
+mem/0: location 1044 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1044
+mem/0: storing 1 in location 1045
 run/0: instruction string-equal/8
 run/0: break-if {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1044 is 1
+mem/0: location 1045 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 10
@@ -81,63 +81,63 @@ string-equal/0: comparing characters
 run/0: instruction string-equal/12
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1045
+mem/0: storing 0 in location 1046
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 0
+mem/0: location 1046 is 0
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1046
+mem/0: storing 0 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 0
-run/0: address to copy is 1031
+mem/0: location 1046 is 0
+run/0: address to copy is 1032
 run/0: its type is 4
-mem/0: location 1031 is 97
+mem/0: location 1032 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1047
+mem/0: storing 97 in location 1048
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
+mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 0
-run/0: address to copy is 1035
+mem/0: location 1046 is 0
+run/0: address to copy is 1036
 run/0: its type is 4
-mem/0: location 1035 is 97
+mem/0: location 1036 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1048
+mem/0: storing 97 in location 1049
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1047 is 97
-run/0: ingredient 1 is b2
 mem/0: location 1048 is 97
+run/0: ingredient 1 is b2
+mem/0: location 1049 is 97
 run/0: product 0 is 1
-mem/0: storing 1 in location 1049
+mem/0: storing 1 in location 1050
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1049 is 1
+mem/0: location 1050 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 0
+mem/0: location 1046 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1045
+mem/0: storing 1 in location 1046
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -145,59 +145,59 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1046
+mem/0: storing 0 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 1
-run/0: address to copy is 1032
+mem/0: location 1046 is 1
+run/0: address to copy is 1033
 run/0: its type is 4
-mem/0: location 1032 is 98
+mem/0: location 1033 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1047
+mem/0: storing 98 in location 1048
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
+mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 1
-run/0: address to copy is 1036
+mem/0: location 1046 is 1
+run/0: address to copy is 1037
 run/0: its type is 4
-mem/0: location 1036 is 98
+mem/0: location 1037 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1048
+mem/0: storing 98 in location 1049
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1047 is 98
-run/0: ingredient 1 is b2
 mem/0: location 1048 is 98
+run/0: ingredient 1 is b2
+mem/0: location 1049 is 98
 run/0: product 0 is 1
-mem/0: storing 1 in location 1049
+mem/0: storing 1 in location 1050
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1049 is 1
+mem/0: location 1050 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1045
+mem/0: storing 2 in location 1046
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -205,59 +205,59 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 2
+mem/0: location 1046 is 2
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1046
+mem/0: storing 0 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 0
+mem/0: location 1047 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1030
+mem/0: location 1041 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 2
-run/0: address to copy is 1033
+mem/0: location 1046 is 2
+run/0: address to copy is 1034
 run/0: its type is 4
-mem/0: location 1033 is 99
+mem/0: location 1034 is 99
 run/0: product 0 is 99
-mem/0: storing 99 in location 1047
+mem/0: storing 99 in location 1048
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1042 is 1034
+mem/0: location 1043 is 1035
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1045 is 2
-run/0: address to copy is 1037
+mem/0: location 1046 is 2
+run/0: address to copy is 1038
 run/0: its type is 4
-mem/0: location 1037 is 99
+mem/0: location 1038 is 99
 run/0: product 0 is 99
-mem/0: storing 99 in location 1048
+mem/0: storing 99 in location 1049
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1047 is 99
-run/0: ingredient 1 is b2
 mem/0: location 1048 is 99
+run/0: ingredient 1 is b2
+mem/0: location 1049 is 99
 run/0: product 0 is 1
-mem/0: storing 1 in location 1049
+mem/0: storing 1 in location 1050
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1049 is 1
+mem/0: location 1050 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 2
+mem/0: location 1046 is 2
 run/0: ingredient 1 is 1
 run/0: product 0 is 3
-mem/0: storing 3 in location 1045
+mem/0: storing 3 in location 1046
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -265,14 +265,14 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1045 is 3
+mem/0: location 1046 is 3
 run/0: ingredient 1 is a-len
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1046
+mem/0: storing 1 in location 1047
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1046 is 1
+mem/0: location 1047 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 25
diff --git a/cpp/.traces/string-equal-reflexive b/cpp/.traces/string-equal-reflexive
index 9384569d..b13664f2 100644
--- a/cpp/.traces/string-equal-reflexive
+++ b/cpp/.traces/string-equal-reflexive
@@ -24,45 +24,45 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction test-string-equal-reflexive/1
 run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-mem/0: storing 1030 in location 1002
+mem/0: storing 1031 in location 1002
 run/0: instruction test-string-equal-reflexive/2
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-mem/0: location 1002 is 1030
-mem/0: location 1002 is 1030
+mem/0: location 1002 is 1031
+mem/0: location 1002 is 1031
 run/0: instruction string-equal/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1034
+mem/0: new alloc: 1035
 run/0: instruction string-equal/1
 run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1036
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1037
 run/0: instruction string-equal/2
 run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1036 is 1030
-mem/0: storing 3 in location 1037
+mem/0: location 1037 is 1031
+mem/0: storing 3 in location 1038
 run/0: instruction string-equal/3
 run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1038
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1039
 run/0: instruction string-equal/4
 run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1038 is 1030
-mem/0: storing 3 in location 1039
+mem/0: location 1039 is 1031
+mem/0: storing 3 in location 1040
 run/0: instruction string-equal/6
 run/0: trace {name: "string-equal", value: 0, type: 0, properties: ["string-equal": "literal-string"]}, {name: "comparing lengths", value: 0, type: 0, properties: ["comparing lengths": "literal-string"]}
 string-equal/0: comparing lengths
 run/0: instruction string-equal/7
 run/0: {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]} <- equal {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}, {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]}
 run/0: ingredient 0 is a-len
-mem/0: location 1037 is 3
+mem/0: location 1038 is 3
 run/0: ingredient 1 is b-len
-mem/0: location 1039 is 3
+mem/0: location 1040 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1040
+mem/0: storing 1 in location 1041
 run/0: instruction string-equal/8
 run/0: break-if {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1040 is 1
+mem/0: location 1041 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 10
@@ -72,63 +72,63 @@ string-equal/0: comparing characters
 run/0: instruction string-equal/12
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 run/0: ingredient 0 is 0
-mem/0: storing 0 in location 1041
+mem/0: storing 0 in location 1042
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 0
+mem/0: location 1042 is 0
 run/0: ingredient 1 is a-len
-mem/0: location 1037 is 3
+mem/0: location 1038 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1042
+mem/0: storing 0 in location 1043
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1042 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1036 is 1030
+mem/0: location 1037 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1041 is 0
-run/0: address to copy is 1031
+mem/0: location 1042 is 0
+run/0: address to copy is 1032
 run/0: its type is 4
-mem/0: location 1031 is 97
+mem/0: location 1032 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1043
+mem/0: storing 97 in location 1044
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1038 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1041 is 0
-run/0: address to copy is 1031
+mem/0: location 1042 is 0
+run/0: address to copy is 1032
 run/0: its type is 4
-mem/0: location 1031 is 97
+mem/0: location 1032 is 97
 run/0: product 0 is 97
-mem/0: storing 97 in location 1044
+mem/0: storing 97 in location 1045
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1043 is 97
-run/0: ingredient 1 is b2
 mem/0: location 1044 is 97
+run/0: ingredient 1 is b2
+mem/0: location 1045 is 97
 run/0: product 0 is 1
-mem/0: storing 1 in location 1045
+mem/0: storing 1 in location 1046
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 0
+mem/0: location 1042 is 0
 run/0: ingredient 1 is 1
 run/0: product 0 is 1
-mem/0: storing 1 in location 1041
+mem/0: storing 1 in location 1042
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -136,59 +136,59 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 1
+mem/0: location 1042 is 1
 run/0: ingredient 1 is a-len
-mem/0: location 1037 is 3
+mem/0: location 1038 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1042
+mem/0: storing 0 in location 1043
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1042 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1036 is 1030
+mem/0: location 1037 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1041 is 1
-run/0: address to copy is 1032
+mem/0: location 1042 is 1
+run/0: address to copy is 1033
 run/0: its type is 4
-mem/0: location 1032 is 98
+mem/0: location 1033 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1043
+mem/0: storing 98 in location 1044
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1038 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1041 is 1
-run/0: address to copy is 1032
+mem/0: location 1042 is 1
+run/0: address to copy is 1033
 run/0: its type is 4
-mem/0: location 1032 is 98
+mem/0: location 1033 is 98
 run/0: product 0 is 98
-mem/0: storing 98 in location 1044
+mem/0: storing 98 in location 1045
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1043 is 98
-run/0: ingredient 1 is b2
 mem/0: location 1044 is 98
+run/0: ingredient 1 is b2
+mem/0: location 1045 is 98
 run/0: product 0 is 1
-mem/0: storing 1 in location 1045
+mem/0: storing 1 in location 1046
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 1
+mem/0: location 1042 is 1
 run/0: ingredient 1 is 1
 run/0: product 0 is 2
-mem/0: storing 2 in location 1041
+mem/0: storing 2 in location 1042
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -196,59 +196,59 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 2
+mem/0: location 1042 is 2
 run/0: ingredient 1 is a-len
-mem/0: location 1037 is 3
+mem/0: location 1038 is 3
 run/0: product 0 is 0
-mem/0: storing 0 in location 1042
+mem/0: storing 0 in location 1043
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1042 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
 run/0: {name: "a2", value: 8, type: 4, properties: ["a2": "character"]} <- index {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1036 is 1030
+mem/0: location 1037 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1041 is 2
-run/0: address to copy is 1033
+mem/0: location 1042 is 2
+run/0: address to copy is 1034
 run/0: its type is 4
-mem/0: location 1033 is 99
+mem/0: location 1034 is 99
 run/0: product 0 is 99
-mem/0: storing 99 in location 1043
+mem/0: storing 99 in location 1044
 run/0: instruction string-equal/17
 run/0: {name: "b2", value: 9, type: 4, properties: ["b2": "character"]} <- index {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1038 is 1030
+mem/0: location 1039 is 1031
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
-mem/0: location 1041 is 2
-run/0: address to copy is 1033
+mem/0: location 1042 is 2
+run/0: address to copy is 1034
 run/0: its type is 4
-mem/0: location 1033 is 99
+mem/0: location 1034 is 99
 run/0: product 0 is 99
-mem/0: storing 99 in location 1044
+mem/0: storing 99 in location 1045
 run/0: instruction string-equal/19
 run/0: {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]} <- equal {name: "a2", value: 8, type: 4, properties: ["a2": "character"]}, {name: "b2", value: 9, type: 4, properties: ["b2": "character"]}
 run/0: ingredient 0 is a2
-mem/0: location 1043 is 99
-run/0: ingredient 1 is b2
 mem/0: location 1044 is 99
+run/0: ingredient 1 is b2
+mem/0: location 1045 is 99
 run/0: product 0 is 1
-mem/0: storing 1 in location 1045
+mem/0: storing 1 in location 1046
 run/0: instruction string-equal/20
 run/0: break-if {name: "chars-match?", value: 10, type: 3, properties: ["chars-match?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1045 is 1
+mem/0: location 1046 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 22
 run/0: instruction string-equal/23
 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 2
+mem/0: location 1042 is 2
 run/0: ingredient 1 is 1
 run/0: product 0 is 3
-mem/0: storing 3 in location 1041
+mem/0: storing 3 in location 1042
 run/0: instruction string-equal/24
 run/0: loop {name: "", value: -11, type: , properties: ["": ]}
 run/0: ingredient 0 is -11
@@ -256,14 +256,14 @@ run/0: jumping to instruction 14
 run/0: instruction string-equal/14
 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}
 run/0: ingredient 0 is i
-mem/0: location 1041 is 3
+mem/0: location 1042 is 3
 run/0: ingredient 1 is a-len
-mem/0: location 1037 is 3
+mem/0: location 1038 is 3
 run/0: product 0 is 1
-mem/0: storing 1 in location 1042
+mem/0: storing 1 in location 1043
 run/0: instruction string-equal/15
 run/0: break-if {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 9, type: , properties: ["": ]}
-mem/0: location 1042 is 1
+mem/0: location 1043 is 1
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 
 run/0: jumping to instruction 25
diff --git a/cpp/.traces/string-equal-with-empty b/cpp/.traces/string-equal-with-empty
index b3e87b15..ff241a4c 100644
--- a/cpp/.traces/string-equal-with-empty
+++ b/cpp/.traces/string-equal-with-empty
@@ -30,48 +30,48 @@ mem/0: array size is 30
 mem/0: new alloc: 1000
 run/0: instruction test-string-equal-with-empty/1
 run/0: {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]} <- new {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
-mem/0: storing 1030 in location 1002
+mem/0: storing 1031 in location 1002
 run/0: instruction test-string-equal-with-empty/2
 run/0: {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]} <- new {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
-mem/0: storing 1031 in location 1003
+mem/0: storing 1032 in location 1003
 run/0: instruction test-string-equal-with-empty/3
 run/0: {name: "3", value: 3, type: 3, properties: ["3": "boolean", "raw": ]} <- string-equal {name: "x", value: 1, type: 2-5-4, properties: ["x": "address":"array":"character"]}, {name: "y", value: 2, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-mem/0: location 1002 is 1030
-mem/0: location 1003 is 1031
+mem/0: location 1002 is 1031
+mem/0: location 1003 is 1032
 run/0: instruction string-equal/0
 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]}
 mem/0: array size is 30
-mem/0: new alloc: 1036
+mem/0: new alloc: 1037
 run/0: instruction string-equal/1
 run/0: {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1030
-mem/0: storing 1030 in location 1038
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1039
 run/0: instruction string-equal/2
 run/0: {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]} <- length {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
-mem/0: location 1038 is 1030
-mem/0: storing 0 in location 1039
+mem/0: location 1039 is 1031
+mem/0: storing 0 in location 1040
 run/0: instruction string-equal/3
 run/0: {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character"]} <- next-ingredient 
-run/0: product 0 is 1031
-mem/0: storing 1031 in location 1040
+run/0: product 0 is 1032
+mem/0: storing 1032 in location 1041
 run/0: instruction string-equal/4
 run/0: {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]} <- length {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
-mem/0: location 1040 is 1031
-mem/0: storing 4 in location 1041
+mem/0: location 1041 is 1032
+mem/0: storing 4 in location 1042
 run/0: instruction string-equal/6
 run/0: trace {name: "string-equal", value: 0, type: 0, properties: ["string-equal": "literal-string"]}, {name: "comparing lengths", value: 0, type: 0, properties: ["comparing lengths": "literal-string"]}
 string-equal/0: comparing lengths
 run/0: instruction string-equal/7
 run/0: {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]} <- equal {name: "a-len", value: 2, type: 1, properties: ["a-len": "integer"]}, {name: "b-len", value: 4, type: 1, properties: ["b-len": "integer"]}
 run/0: ingredient 0 is a-len
-mem/0: location 1039 is 0
+mem/0: location 1040 is 0
 run/0: ingredient 1 is b-len
-mem/0: location 1041 is 4
+mem/0: location 1042 is 4
 run/0: product 0 is 0
-mem/0: storing 0 in location 1042
+mem/0: storing 0 in location 1043
 run/0: instruction string-equal/8
 run/0: break-if {name: "length-equal?", value: 5, type: 3, properties: ["length-equal?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
-mem/0: location 1042 is 0
+mem/0: location 1043 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/9
diff --git a/cpp/011load.cc b/cpp/011load.cc
index 9afe370e..df64cae7 100644
--- a/cpp/011load.cc
+++ b/cpp/011load.cc
@@ -91,7 +91,7 @@ bool next_instruction(istream& in, instruction* curr) {
     return false;  // end of recipe
   }
 
-  if (words.size() == 1 && !isalnum(words[0][0])) {
+  if (words.size() == 1 && !isalnum(words[0][0]) && words[0][0] != '$') {
     curr->is_label = true;
     curr->label = words[0];
     trace("parse") << "label: " << curr->label;
@@ -256,6 +256,12 @@ recipe main [
 ]
 +parse: label: +foo
 
+:(scenario parse_dollar_as_recipe_name)
+recipe main [
+  $foo
+]
++parse: instruction: $foo
+
 :(scenario parse_multiple_properties)
 recipe main [
   1:integer <- copy 23:literal/foo:bar:baz
diff --git a/cpp/027debug.cc b/cpp/027debug.cc
index d81071e9..90ef9e49 100644
--- a/cpp/027debug.cc
+++ b/cpp/027debug.cc
@@ -19,3 +19,24 @@ case _PRINT: {
   }
   break;
 }
+
+:(before "End Primitive Recipe Declarations")
+_START_TRACING,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["$start-tracing"] = _START_TRACING;
+:(before "End Primitive Recipe Implementations")
+case _START_TRACING: {
+  Trace_stream->dump_layer = "all";
+//?   cout << Trace_stream << ": " << Trace_stream->dump_layer << '\n'; //? 1
+  break;
+}
+
+:(before "End Primitive Recipe Declarations")
+_STOP_TRACING,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["$stop-tracing"] = _STOP_TRACING;
+:(before "End Primitive Recipe Implementations")
+case _STOP_TRACING: {
+  Trace_stream->dump_layer = "";
+  break;
+}
diff --git a/cpp/042new.cc b/cpp/042new.cc
index e98800a6..4639beb5 100644
--- a/cpp/042new.cc
+++ b/cpp/042new.cc
@@ -60,7 +60,7 @@ case NEW: {
       vector<int> capacity = read_memory(current_instruction().ingredients[1]);
       array_length = capacity[0];
       trace("mem") << "array size is " << array_length;
-      size = array_length*size_of(type);
+      size = array_length*size_of(type) + /*space for length*/1;
     }
     else {
       // scalar
@@ -104,7 +104,7 @@ recipe main [
 +mem: array size is 5
 +run: instruction main/1
 +run: instruction main/2
-+mem: storing 5 in location 3
++mem: storing 6 in location 3
 
 //: Make sure that each routine gets a different alloc to start.
 :(scenario new_concurrent)
diff --git a/cpp/043space.cc b/cpp/043space.cc
index 5d9c8555..e94cf023 100644
--- a/cpp/043space.cc
+++ b/cpp/043space.cc
@@ -99,7 +99,7 @@ int space_base(const reagent& x) {
 
 int address(int offset, int base) {
   if (base == 0) return offset;  // raw
-//?   cout << base << '\n'; //? 1
+//?   cout << base << '\n'; //? 2
   if (offset >= Memory[base]) {
     // todo: test
     raise << "location " << offset << " is out of bounds " << Memory[base] << '\n';
diff --git a/cpp/071print.mu b/cpp/071print.mu
index 32c4305c..bd7f2411 100644
--- a/cpp/071print.mu
+++ b/cpp/071print.mu
@@ -40,8 +40,8 @@ recipe clear-screen [
     {
       done?:boolean <- greater-or-equal i:integer, max:integer
       break-if done?:boolean
-      x:address:character <- index-address buf:address:array:character/deref, i:integer
-      x:address:character/deref <- copy [ ]
+      c:address:character <- index-address buf:address:array:character/deref, i:integer
+      c:address:character/deref <- copy [ ]
       i:integer <- add i:integer, 1:literal
       loop
     }
@@ -81,6 +81,21 @@ recipe print-character [
   reply x:address:screen/same-as-ingredient:0
 ]
 
+scenario print-character-at-top-left [
+  run [
+#?     $start-tracing #? 3
+    1:address:screen <- init-fake-screen 3:literal/width, 2:literal/height
+    1:address:screen <- print-character 1:address:screen, 97:literal  # 'a'
+    2:address:array:character <- get 1:address:screen/deref, data:offset
+    3:array:character <- copy 2:address:array:character/deref
+  ]
+  memory should contain [
+    3 <- 6  # width*height
+    4 <- 97  # 'a'
+    5 <- 0
+  ]
+]
+
 recipe clear-line [
   default-space:address:array:location <- new location:type, 30:literal
   x:address:screen <- next-ingredient