about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/divide_with_remainder2
-rw-r--r--cpp/.traces/divide_with_remainder_literal2
-rw-r--r--cpp/.traces/integer-to-decimal-digit-negative477
-rw-r--r--cpp/.traces/integer-to-decimal-digit-positive675
-rw-r--r--cpp/.traces/integer-to-decimal-digit-zero33
-rw-r--r--cpp/.traces/less_than (renamed from cpp/.traces/lesser_than)2
-rw-r--r--cpp/.traces/less_than2 (renamed from cpp/.traces/lesser_than2)2
-rw-r--r--cpp/021arithmetic6
-rw-r--r--cpp/024compare14
-rw-r--r--cpp/060string.mu93
10 files changed, 1292 insertions, 14 deletions
diff --git a/cpp/.traces/divide_with_remainder b/cpp/.traces/divide_with_remainder
index 867b2c0d..d8989d9c 100644
--- a/cpp/.traces/divide_with_remainder
+++ b/cpp/.traces/divide_with_remainder
@@ -12,7 +12,7 @@ parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
-after-brace/0: divide_with_remainder ...
+after-brace/0: divide-with-remainder ...
 run/0: instruction main/0
 run/0: ingredient 0 is 27
 mem/0: storing 27 in location 1
diff --git a/cpp/.traces/divide_with_remainder_literal b/cpp/.traces/divide_with_remainder_literal
index 8cb01953..05bde8a9 100644
--- a/cpp/.traces/divide_with_remainder_literal
+++ b/cpp/.traces/divide_with_remainder_literal
@@ -4,7 +4,7 @@ parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
-after-brace/0: divide_with_remainder ...
+after-brace/0: divide-with-remainder ...
 run/0: instruction main/0
 run/0: ingredient 0 is 9
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/integer-to-decimal-digit-negative b/cpp/.traces/integer-to-decimal-digit-negative
new file mode 100644
index 00000000..d629d10a
--- /dev/null
+++ b/cpp/.traces/integer-to-decimal-digit-negative
@@ -0,0 +1,477 @@
+parse/0: instruction: 105
+parse/0:   ingredient: {name: "-1", value: 0, type: 0, properties: ["-1": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
+parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
+after-brace/0: recipe test-integer-to-decimal-digit-negative
+after-brace/0: integer-to-decimal-string ...
+after-brace/0: copy ...
+run/0: instruction test-integer-to-decimal-digit-negative/0
+run/0: instruction integer-to-decimal-string/0
+mem/0: new alloc: 1000
+mem/0: array size is 30
+run/0: instruction integer-to-decimal-string/1
+run/0: product 0 is -1
+mem/0: storing -1 in location 1002
+run/0: instruction integer-to-decimal-string/3
+mem/0: location 1002 is -1
+run/0: ingredient 0 is -1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 6
+run/0: instruction integer-to-decimal-string/7
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1004
+run/0: instruction integer-to-decimal-string/9
+run/0: ingredient 0 is n
+mem/0: location 1002 is -1
+run/0: ingredient 1 is 0
+run/0: product 0 is 1
+mem/0: storing 1 in location 1005
+run/0: instruction integer-to-decimal-string/10
+mem/0: location 1005 is 1
+run/0: ingredient 0 is 1
+run/0: jump-unless fell through
+run/0: instruction integer-to-decimal-string/11
+run/0: ingredient 0 is 1
+mem/0: storing 1 in location 1004
+run/0: instruction integer-to-decimal-string/12
+run/0: ingredient 0 is n
+mem/0: location 1002 is -1
+run/0: ingredient 1 is -1
+run/0: ingredient 1 is -1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1002
+run/0: instruction integer-to-decimal-string/14
+run/0: instruction init-buffer/0
+mem/0: new alloc: 1030
+mem/0: array size is 30
+run/0: instruction init-buffer/1
+mem/0: new alloc: 1060
+mem/0: storing 1060 in location 1032
+run/0: instruction init-buffer/2
+run/0: ingredient 0 is result
+mem/0: location 1032 is 1060
+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: instruction init-buffer/3
+run/0: ingredient 0 is 0
+mem/0: location 1033 is 1060
+mem/0: storing 0 in location 1060
+run/0: instruction init-buffer/4
+run/0: ingredient 0 is result
+mem/0: location 1032 is 1060
+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: instruction init-buffer/5
+run/0: product 0 is 30
+mem/0: storing 30 in location 1035
+run/0: instruction init-buffer/6
+mem/0: new alloc: 1062
+mem/0: location 1034 is 1061
+mem/0: storing 1062 in location 1061
+mem/0: location 1035 is 30
+mem/0: array size is 30
+run/0: instruction init-buffer/7
+mem/0: location 1032 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/15
+run/0: ingredient 0 is 48
+mem/0: storing 48 in location 1007
+run/0: instruction integer-to-decimal-string/17
+run/0: ingredient 0 is n
+mem/0: location 1002 is 1
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/18
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/19
+run/0: ingredient 0 is n
+mem/0: location 1002 is 1
+run/0: ingredient 1 is 10
+run/0: product 0 is 0
+mem/0: storing 0 in location 1002
+run/0: product 1 is 1
+mem/0: storing 1 in location 1009
+run/0: instruction integer-to-decimal-string/20
+run/0: ingredient 0 is digit-base
+mem/0: location 1007 is 48
+run/0: ingredient 1 is digit
+mem/0: location 1009 is 1
+run/0: product 0 is 49
+mem/0: storing 49 in location 1010
+run/0: instruction integer-to-decimal-string/21
+mem/0: location 1006 is 1060
+mem/0: location 1010 is 49
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1092
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1094
+run/0: instruction buffer-append/2
+run/0: product 0 is 49
+mem/0: storing 49 in location 1095
+run/0: instruction buffer-append/4
+mem/0: location 1094 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1122
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1124
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1124 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1125
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1124 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-full?/4
+mem/0: location 1126 is 1062
+mem/0: storing 30 in location 1127
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1125 is 0
+run/0: ingredient 1 is capacity
+mem/0: location 1127 is 30
+run/0: product 0 is 0
+mem/0: storing 0 in location 1128
+run/0: instruction buffer-full?/6
+mem/0: location 1128 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1096
+run/0: instruction buffer-append/5
+mem/0: location 1096 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: ingredient 0 is in
+mem/0: location 1094 is 1060
+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: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1094 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1098 is 1062
+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
+run/0: instruction buffer-append/11
+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
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1097 is 1060
+mem/0: location 1060 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
+run/0: instruction buffer-append/13
+mem/0: location 1094 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/22
+run/0: ingredient 0 is -6
+run/0: pc now 16
+run/0: instruction integer-to-decimal-string/17
+run/0: ingredient 0 is n
+mem/0: location 1002 is 0
+run/0: ingredient 1 is 0
+run/0: product 0 is 1
+mem/0: storing 1 in location 1008
+run/0: instruction integer-to-decimal-string/18
+mem/0: location 1008 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 23
+run/0: instruction integer-to-decimal-string/25
+mem/0: location 1004 is 1
+run/0: ingredient 0 is 1
+run/0: jump-unless fell through
+run/0: instruction integer-to-decimal-string/26
+mem/0: location 1006 is 1060
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1152
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1154
+run/0: instruction buffer-append/2
+run/0: product 0 is 45
+mem/0: storing 45 in location 1155
+run/0: instruction buffer-append/4
+mem/0: location 1154 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1182
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1184
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1184 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1185
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1184 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-full?/4
+mem/0: location 1186 is 1062
+mem/0: storing 30 in location 1187
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1185 is 1
+run/0: ingredient 1 is capacity
+mem/0: location 1187 is 30
+run/0: product 0 is 0
+mem/0: storing 0 in location 1188
+run/0: instruction buffer-full?/6
+mem/0: location 1188 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1156
+run/0: instruction buffer-append/5
+mem/0: location 1156 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: ingredient 0 is in
+mem/0: location 1154 is 1060
+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: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1154 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1158 is 1062
+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
+run/0: instruction buffer-append/11
+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
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1157 is 1060
+mem/0: location 1060 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
+run/0: instruction buffer-append/13
+mem/0: location 1154 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/28
+run/0: ingredient 0 is tmp
+mem/0: location 1006 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 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: ingredient 0 is tmp
+mem/0: location 1006 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction integer-to-decimal-string/30
+mem/0: new alloc: 1212
+mem/0: storing 1212 in location 1003
+mem/0: location 1011 is 2
+mem/0: array size is 2
+run/0: instruction integer-to-decimal-string/31
+run/0: ingredient 0 is len
+mem/0: location 1011 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1013
+run/0: instruction integer-to-decimal-string/32
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1014
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is 1
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/36
+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
+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: its type is 4
+mem/0: location 1064 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: ingredient 0 is result
+mem/0: location 1003 is 1212
+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: instruction integer-to-decimal-string/38
+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
+run/0: instruction integer-to-decimal-string/39
+run/0: ingredient 0 is i
+mem/0: location 1013 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 0
+mem/0: storing 0 in location 1013
+run/0: instruction integer-to-decimal-string/40
+run/0: ingredient 0 is j
+mem/0: location 1014 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1014
+run/0: instruction integer-to-decimal-string/41
+run/0: ingredient 0 is -8
+run/0: pc now 33
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is 0
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/36
+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
+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: its type is 4
+mem/0: location 1063 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: ingredient 0 is result
+mem/0: location 1003 is 1212
+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: instruction integer-to-decimal-string/38
+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
+run/0: instruction integer-to-decimal-string/39
+run/0: ingredient 0 is i
+mem/0: location 1013 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is -1
+mem/0: storing -1 in location 1013
+run/0: instruction integer-to-decimal-string/40
+run/0: ingredient 0 is j
+mem/0: location 1014 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1014
+run/0: instruction integer-to-decimal-string/41
+run/0: ingredient 0 is -8
+run/0: pc now 33
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is -1
+run/0: ingredient 1 is 0
+run/0: product 0 is 1
+mem/0: storing 1 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 42
+run/0: instruction integer-to-decimal-string/43
+mem/0: location 1003 is 1212
+run/0: result 0 is 1212
+mem/0: storing 1212 in location 1
+run/0: instruction test-integer-to-decimal-digit-negative/1
+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: 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
new file mode 100644
index 00000000..70cc577f
--- /dev/null
+++ b/cpp/.traces/integer-to-decimal-digit-positive
@@ -0,0 +1,675 @@
+parse/0: instruction: 105
+parse/0:   ingredient: {name: "234", value: 0, type: 0, properties: ["234": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
+parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
+after-brace/0: recipe test-integer-to-decimal-digit-positive
+after-brace/0: integer-to-decimal-string ...
+after-brace/0: copy ...
+run/0: instruction test-integer-to-decimal-digit-positive/0
+run/0: instruction integer-to-decimal-string/0
+mem/0: new alloc: 1000
+mem/0: array size is 30
+run/0: instruction integer-to-decimal-string/1
+run/0: product 0 is 234
+mem/0: storing 234 in location 1002
+run/0: instruction integer-to-decimal-string/3
+mem/0: location 1002 is 234
+run/0: ingredient 0 is 234
+run/0: ingredient 1 is 
+run/0: jumping to instruction 6
+run/0: instruction integer-to-decimal-string/7
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1004
+run/0: instruction integer-to-decimal-string/9
+run/0: ingredient 0 is n
+mem/0: location 1002 is 234
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1005
+run/0: instruction integer-to-decimal-string/10
+mem/0: location 1005 is 0
+run/0: ingredient 0 is 0
+run/0: ingredient 1 is 
+run/0: jumping to instruction 13
+run/0: instruction integer-to-decimal-string/14
+run/0: instruction init-buffer/0
+mem/0: new alloc: 1030
+mem/0: array size is 30
+run/0: instruction init-buffer/1
+mem/0: new alloc: 1060
+mem/0: storing 1060 in location 1032
+run/0: instruction init-buffer/2
+run/0: ingredient 0 is result
+mem/0: location 1032 is 1060
+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: instruction init-buffer/3
+run/0: ingredient 0 is 0
+mem/0: location 1033 is 1060
+mem/0: storing 0 in location 1060
+run/0: instruction init-buffer/4
+run/0: ingredient 0 is result
+mem/0: location 1032 is 1060
+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: instruction init-buffer/5
+run/0: product 0 is 30
+mem/0: storing 30 in location 1035
+run/0: instruction init-buffer/6
+mem/0: new alloc: 1062
+mem/0: location 1034 is 1061
+mem/0: storing 1062 in location 1061
+mem/0: location 1035 is 30
+mem/0: array size is 30
+run/0: instruction init-buffer/7
+mem/0: location 1032 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/15
+run/0: ingredient 0 is 48
+mem/0: storing 48 in location 1007
+run/0: instruction integer-to-decimal-string/17
+run/0: ingredient 0 is n
+mem/0: location 1002 is 234
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/18
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/19
+run/0: ingredient 0 is n
+mem/0: location 1002 is 234
+run/0: ingredient 1 is 10
+run/0: product 0 is 23
+mem/0: storing 23 in location 1002
+run/0: product 1 is 4
+mem/0: storing 4 in location 1009
+run/0: instruction integer-to-decimal-string/20
+run/0: ingredient 0 is digit-base
+mem/0: location 1007 is 48
+run/0: ingredient 1 is digit
+mem/0: location 1009 is 4
+run/0: product 0 is 52
+mem/0: storing 52 in location 1010
+run/0: instruction integer-to-decimal-string/21
+mem/0: location 1006 is 1060
+mem/0: location 1010 is 52
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1092
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1094
+run/0: instruction buffer-append/2
+run/0: product 0 is 52
+mem/0: storing 52 in location 1095
+run/0: instruction buffer-append/4
+mem/0: location 1094 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1122
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1124
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1124 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1125
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1124 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-full?/4
+mem/0: location 1126 is 1062
+mem/0: storing 30 in location 1127
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1125 is 0
+run/0: ingredient 1 is capacity
+mem/0: location 1127 is 30
+run/0: product 0 is 0
+mem/0: storing 0 in location 1128
+run/0: instruction buffer-full?/6
+mem/0: location 1128 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1096
+run/0: instruction buffer-append/5
+mem/0: location 1096 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: ingredient 0 is in
+mem/0: location 1094 is 1060
+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: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1094 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1098 is 1062
+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
+run/0: instruction buffer-append/11
+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
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1097 is 1060
+mem/0: location 1060 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
+run/0: instruction buffer-append/13
+mem/0: location 1094 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/22
+run/0: ingredient 0 is -6
+run/0: pc now 16
+run/0: instruction integer-to-decimal-string/17
+run/0: ingredient 0 is n
+mem/0: location 1002 is 23
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/18
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/19
+run/0: ingredient 0 is n
+mem/0: location 1002 is 23
+run/0: ingredient 1 is 10
+run/0: product 0 is 2
+mem/0: storing 2 in location 1002
+run/0: product 1 is 3
+mem/0: storing 3 in location 1009
+run/0: instruction integer-to-decimal-string/20
+run/0: ingredient 0 is digit-base
+mem/0: location 1007 is 48
+run/0: ingredient 1 is digit
+mem/0: location 1009 is 3
+run/0: product 0 is 51
+mem/0: storing 51 in location 1010
+run/0: instruction integer-to-decimal-string/21
+mem/0: location 1006 is 1060
+mem/0: location 1010 is 51
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1152
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1154
+run/0: instruction buffer-append/2
+run/0: product 0 is 51
+mem/0: storing 51 in location 1155
+run/0: instruction buffer-append/4
+mem/0: location 1154 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1182
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1184
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1184 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1185
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1184 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-full?/4
+mem/0: location 1186 is 1062
+mem/0: storing 30 in location 1187
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1185 is 1
+run/0: ingredient 1 is capacity
+mem/0: location 1187 is 30
+run/0: product 0 is 0
+mem/0: storing 0 in location 1188
+run/0: instruction buffer-full?/6
+mem/0: location 1188 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1156
+run/0: instruction buffer-append/5
+mem/0: location 1156 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: ingredient 0 is in
+mem/0: location 1154 is 1060
+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: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1154 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1158 is 1062
+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
+run/0: instruction buffer-append/11
+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
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1157 is 1060
+mem/0: location 1060 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
+run/0: instruction buffer-append/13
+mem/0: location 1154 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/22
+run/0: ingredient 0 is -6
+run/0: pc now 16
+run/0: instruction integer-to-decimal-string/17
+run/0: ingredient 0 is n
+mem/0: location 1002 is 2
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/18
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/19
+run/0: ingredient 0 is n
+mem/0: location 1002 is 2
+run/0: ingredient 1 is 10
+run/0: product 0 is 0
+mem/0: storing 0 in location 1002
+run/0: product 1 is 2
+mem/0: storing 2 in location 1009
+run/0: instruction integer-to-decimal-string/20
+run/0: ingredient 0 is digit-base
+mem/0: location 1007 is 48
+run/0: ingredient 1 is digit
+mem/0: location 1009 is 2
+run/0: product 0 is 50
+mem/0: storing 50 in location 1010
+run/0: instruction integer-to-decimal-string/21
+mem/0: location 1006 is 1060
+mem/0: location 1010 is 50
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1212
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1214
+run/0: instruction buffer-append/2
+run/0: product 0 is 50
+mem/0: storing 50 in location 1215
+run/0: instruction buffer-append/4
+mem/0: location 1214 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1242
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1244
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1244 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 2
+run/0: product 0 is 2
+mem/0: storing 2 in location 1245
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1244 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-full?/4
+mem/0: location 1246 is 1062
+mem/0: storing 30 in location 1247
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1245 is 2
+run/0: ingredient 1 is capacity
+mem/0: location 1247 is 30
+run/0: product 0 is 0
+mem/0: storing 0 in location 1248
+run/0: instruction buffer-full?/6
+mem/0: location 1248 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1216
+run/0: instruction buffer-append/5
+mem/0: location 1216 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: ingredient 0 is in
+mem/0: location 1214 is 1060
+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: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1214 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1218 is 1062
+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
+run/0: instruction buffer-append/11
+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
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1217 is 1060
+mem/0: location 1060 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
+run/0: instruction buffer-append/13
+mem/0: location 1214 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1006
+run/0: instruction integer-to-decimal-string/22
+run/0: ingredient 0 is -6
+run/0: pc now 16
+run/0: instruction integer-to-decimal-string/17
+run/0: ingredient 0 is n
+mem/0: location 1002 is 0
+run/0: ingredient 1 is 0
+run/0: product 0 is 1
+mem/0: storing 1 in location 1008
+run/0: instruction integer-to-decimal-string/18
+mem/0: location 1008 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 23
+run/0: instruction integer-to-decimal-string/25
+mem/0: location 1004 is 0
+run/0: ingredient 0 is 0
+run/0: ingredient 1 is 
+run/0: jumping to instruction 27
+run/0: instruction integer-to-decimal-string/28
+run/0: ingredient 0 is tmp
+mem/0: location 1006 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 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: ingredient 0 is tmp
+mem/0: location 1006 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+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
+run/0: instruction integer-to-decimal-string/30
+mem/0: new alloc: 1272
+mem/0: storing 1272 in location 1003
+mem/0: location 1011 is 3
+mem/0: array size is 3
+run/0: instruction integer-to-decimal-string/31
+run/0: ingredient 0 is len
+mem/0: location 1011 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1013
+run/0: instruction integer-to-decimal-string/32
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1014
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is 2
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/36
+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
+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: its type is 4
+mem/0: location 1065 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: ingredient 0 is result
+mem/0: location 1003 is 1272
+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: instruction integer-to-decimal-string/38
+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
+run/0: instruction integer-to-decimal-string/39
+run/0: ingredient 0 is i
+mem/0: location 1013 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1013
+run/0: instruction integer-to-decimal-string/40
+run/0: ingredient 0 is j
+mem/0: location 1014 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1014
+run/0: instruction integer-to-decimal-string/41
+run/0: ingredient 0 is -8
+run/0: pc now 33
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is 1
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/36
+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
+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: its type is 4
+mem/0: location 1064 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: ingredient 0 is result
+mem/0: location 1003 is 1272
+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: instruction integer-to-decimal-string/38
+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
+run/0: instruction integer-to-decimal-string/39
+run/0: ingredient 0 is i
+mem/0: location 1013 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 0
+mem/0: storing 0 in location 1013
+run/0: instruction integer-to-decimal-string/40
+run/0: ingredient 0 is j
+mem/0: location 1014 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1014
+run/0: instruction integer-to-decimal-string/41
+run/0: ingredient 0 is -8
+run/0: pc now 33
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is 0
+run/0: ingredient 1 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/36
+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
+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: its type is 4
+mem/0: location 1063 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: ingredient 0 is result
+mem/0: location 1003 is 1272
+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: instruction integer-to-decimal-string/38
+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
+run/0: instruction integer-to-decimal-string/39
+run/0: ingredient 0 is i
+mem/0: location 1013 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is -1
+mem/0: storing -1 in location 1013
+run/0: instruction integer-to-decimal-string/40
+run/0: ingredient 0 is j
+mem/0: location 1014 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1014
+run/0: instruction integer-to-decimal-string/41
+run/0: ingredient 0 is -8
+run/0: pc now 33
+run/0: instruction integer-to-decimal-string/34
+run/0: ingredient 0 is i
+mem/0: location 1013 is -1
+run/0: ingredient 1 is 0
+run/0: product 0 is 1
+mem/0: storing 1 in location 1008
+run/0: instruction integer-to-decimal-string/35
+mem/0: location 1008 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 42
+run/0: instruction integer-to-decimal-string/43
+mem/0: location 1003 is 1272
+run/0: result 0 is 1272
+mem/0: storing 1272 in location 1
+run/0: instruction test-integer-to-decimal-digit-positive/1
+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: storing 3 in location 2
+mem/0: storing 50 in location 3
+mem/0: storing 51 in location 4
+mem/0: storing 52 in location 5
diff --git a/cpp/.traces/integer-to-decimal-digit-zero b/cpp/.traces/integer-to-decimal-digit-zero
new file mode 100644
index 00000000..39d858e2
--- /dev/null
+++ b/cpp/.traces/integer-to-decimal-digit-zero
@@ -0,0 +1,33 @@
+parse/0: instruction: 105
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
+parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
+after-brace/0: recipe test-integer-to-decimal-digit-zero
+after-brace/0: integer-to-decimal-string ...
+after-brace/0: copy ...
+run/0: instruction test-integer-to-decimal-digit-zero/0
+run/0: instruction integer-to-decimal-string/0
+mem/0: new alloc: 1000
+mem/0: array size is 30
+run/0: instruction integer-to-decimal-string/1
+run/0: product 0 is 0
+mem/0: storing 0 in location 1002
+run/0: instruction integer-to-decimal-string/3
+mem/0: location 1002 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction integer-to-decimal-string/4
+mem/0: storing 1030 in location 1003
+run/0: instruction integer-to-decimal-string/5
+mem/0: location 1003 is 1030
+run/0: result 0 is 1030
+mem/0: storing 1030 in location 1
+run/0: instruction test-integer-to-decimal-digit-zero/1
+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: storing 1 in location 2
+mem/0: storing 48 in location 3
diff --git a/cpp/.traces/lesser_than b/cpp/.traces/less_than
index 9628c081..0d6b4b80 100644
--- a/cpp/.traces/lesser_than
+++ b/cpp/.traces/less_than
@@ -11,7 +11,7 @@ parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
-after-brace/0: lesser-than ...
+after-brace/0: less-than ...
 run/0: instruction main/0
 run/0: ingredient 0 is 32
 mem/0: storing 32 in location 1
diff --git a/cpp/.traces/lesser_than2 b/cpp/.traces/less_than2
index dc373a53..d747f82f 100644
--- a/cpp/.traces/lesser_than2
+++ b/cpp/.traces/less_than2
@@ -11,7 +11,7 @@ parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
-after-brace/0: lesser-than ...
+after-brace/0: less-than ...
 run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing 34 in location 1
diff --git a/cpp/021arithmetic b/cpp/021arithmetic
index 6f7fb1f3..a5ca095a 100644
--- a/cpp/021arithmetic
+++ b/cpp/021arithmetic
@@ -177,7 +177,7 @@ recipe main [
 :(before "End Primitive Recipe Declarations")
 DIVIDE_WITH_REMAINDER,
 :(before "End Primitive Recipe Numbers")
-Recipe_number["divide_with_remainder"] = DIVIDE_WITH_REMAINDER;
+Recipe_number["divide-with-remainder"] = DIVIDE_WITH_REMAINDER;
 :(before "End Primitive Recipe Implementations")
 case DIVIDE_WITH_REMAINDER: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
@@ -199,7 +199,7 @@ case DIVIDE_WITH_REMAINDER: {
 
 :(scenario "divide_with_remainder_literal")
 recipe main [
-  1:integer, 2:integer <- divide_with_remainder 9:literal, 2:literal
+  1:integer, 2:integer <- divide-with-remainder 9:literal, 2:literal
 ]
 +run: instruction main/0
 +run: ingredient 0 is 9
@@ -213,7 +213,7 @@ recipe main [
 recipe main [
   1:integer <- copy 27:literal
   2:integer <- copy 11:literal
-  3:integer, 4:integer <- divide_with_remainder 1:integer, 2:integer
+  3:integer, 4:integer <- divide-with-remainder 1:integer, 2:integer
 ]
 +run: instruction main/2
 +run: ingredient 0 is 1
diff --git a/cpp/024compare b/cpp/024compare
index f39f4941..1484649b 100644
--- a/cpp/024compare
+++ b/cpp/024compare
@@ -93,11 +93,11 @@ recipe main [
 +mem: storing 0 in location 3
 
 :(before "End Primitive Recipe Declarations")
-LESSER_THAN,
+LESS_THAN,
 :(before "End Primitive Recipe Numbers")
-Recipe_number["lesser-than"] = LESSER_THAN;
+Recipe_number["less-than"] = LESS_THAN;
 :(before "End Primitive Recipe Implementations")
-case LESSER_THAN: {
+case LESS_THAN: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
   vector<int> arg0 = read_memory(instructions[pc].ingredients[0]);
   assert(arg0.size() == 1);
@@ -111,11 +111,11 @@ case LESSER_THAN: {
   break;
 }
 
-:(scenario "lesser_than")
+:(scenario "less_than")
 recipe main [
   1:integer <- copy 32:literal
   2:integer <- copy 33:literal
-  3:integer <- lesser-than 1:integer, 2:integer
+  3:integer <- less-than 1:integer, 2:integer
 ]
 +run: instruction main/2
 +run: ingredient 0 is 1
@@ -125,11 +125,11 @@ recipe main [
 +run: product 0 is 1
 +mem: storing 1 in location 3
 
-:(scenario "lesser_than2")
+:(scenario "less_than2")
 recipe main [
   1:integer <- copy 34:literal
   2:integer <- copy 33:literal
-  3:integer <- lesser-than 1:integer, 2:integer
+  3:integer <- less-than 1:integer, 2:integer
 ]
 +run: instruction main/2
 +run: ingredient 0 is 1
diff --git a/cpp/060string.mu b/cpp/060string.mu
index a0d2757d..d81cdf13 100644
--- a/cpp/060string.mu
+++ b/cpp/060string.mu
@@ -230,3 +230,96 @@ scenario buffer-append-works [
     18 <- 0
   ]
 ]
+
+# result:address:array:character <- integer-to-decimal-string n:integer
+recipe integer-to-decimal-string [
+  default-space:address:space <- new location:type, 30:literal
+  n:integer <- next-ingredient
+  # is it zero?
+  {
+    break-if n:integer
+    result:address:array:character <- new [0]
+    reply result:address:array:character
+  }
+  # save sign
+  negate-result:boolean <- copy 0:literal
+  {
+    negative?:boolean <- less-than n:integer, 0:literal
+    break-unless negative?:boolean
+    negate-result:boolean <- copy 1:literal
+    n:integer <- multiply n:integer -1:literal
+  }
+  # add digits from right to left into intermediate buffer
+  tmp:address:buffer <- init-buffer 30:literal
+  digit-base:integer <- copy 48:literal  # '0'
+  {
+    done?:boolean <- equal n:integer, 0:literal
+    break-if done?:boolean
+    n:integer, digit:integer <- divide-with-remainder n:integer, 10:literal
+    c:character <- add digit-base:integer, digit:integer
+    tmp:address:buffer <- buffer-append tmp:address:buffer, c:character
+    loop
+  }
+  # add sign
+  {
+    break-unless negate-result:boolean
+    tmp:address:buffer <- buffer-append tmp:address:buffer, 45:literal  # '-'
+  }
+  # reverse buffer into string result
+  len:integer <- get tmp:address:buffer/deref, length:offset
+  buf:address:array:character <- get tmp:address:buffer/deref data:offset
+  result:address:array:character <- new character:type, len:integer
+  i:integer <- subtract len:integer, 1:literal
+  j:integer <- copy 0:literal
+  {
+    # while i >= 0
+    done?:boolean <- less-than i:integer, 0:literal
+    break-if done?:boolean
+    # result[j] = tmp[i]
+    src:character <- index buf:address:array:character/deref, i:integer
+    dest:address:character <- index-address result:address:array:character/deref, j:integer
+    dest:address:character/deref <- copy src:character
+    # ++i
+    i:integer <- subtract i:integer, 1:literal
+    # --j
+    j:integer <- add j:integer, 1:literal
+    loop
+  }
+  reply result:address:array:character
+]
+
+scenario integer-to-decimal-digit-zero [
+  run [
+    1:address:array:character/raw <- integer-to-decimal-string 0:literal
+    2:array:character/raw <- copy 1:address:array:character/deref/raw
+  ]
+  memory should contain [
+    2 <- 1
+    3 <- 48  # '0'
+  ]
+]
+
+scenario integer-to-decimal-digit-positive [
+  run [
+    1:address:array:character/raw <- integer-to-decimal-string 234:literal
+    2:array:character/raw <- copy 1:address:array:character/deref/raw
+  ]
+  memory should contain [
+    2 <- 3
+    3 <- 50  # '2'
+    4 <- 51  # '3'
+    5 <- 52  # '4'
+  ]
+]
+
+scenario integer-to-decimal-digit-negative [
+  run [
+    1:address:array:character/raw <- integer-to-decimal-string -1:literal
+    2:array:character/raw <- copy 1:address:array:character/deref/raw
+  ]
+  memory should contain [
+    2 <- 2
+    3 <- 45  # '-'
+    4 <- 49  # '1'
+  ]
+]