about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/string-append-1759
-rw-r--r--cpp/060string.mu70
2 files changed, 829 insertions, 0 deletions
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
new file mode 100644
index 00000000..6af54b66
--- /dev/null
+++ b/cpp/.traces/string-append-1
@@ -0,0 +1,759 @@
+parse/0: instruction: 33
+parse/0:   ingredient: {name: "hello,", value: 0, type: 0, properties: ["hello,": "literal-string"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
+parse/0: instruction: 33
+parse/0:   ingredient: {name: " world!", value: 0, type: 0, properties: [" world!": "literal-string"]}
+parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
+parse/0: instruction: 106
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
+parse/0:   ingredient: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
+parse/0:   product: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
+parse/0:   product: {name: "4", value: 0, type: 5-4, properties: ["4": "array":"character", "raw": ]}
+new/0: hello, -> 0
+new/0:  world! -> 0
+after-brace/0: recipe test-string-append-1
+after-brace/0: new ...
+after-brace/0: new ...
+after-brace/0: string-append ...
+after-brace/0: copy ...
+run/0: instruction test-string-append-1/0
+mem/0: storing 1000 in location 1
+run/0: instruction test-string-append-1/1
+mem/0: storing 1007 in location 2
+run/0: instruction test-string-append-1/2
+mem/0: location 1 is 1000
+mem/0: location 2 is 1007
+run/0: instruction string-append/0
+mem/0: new alloc: 1015
+mem/0: array size is 30
+run/0: instruction string-append/1
+run/0: product 0 is 1000
+mem/0: storing 1000 in location 1017
+run/0: instruction string-append/2
+mem/0: location 1017 is 1000
+mem/0: storing 6 in location 1018
+run/0: instruction string-append/3
+run/0: product 0 is 1007
+mem/0: storing 1007 in location 1019
+run/0: instruction string-append/4
+mem/0: location 1019 is 1007
+mem/0: storing 7 in location 1020
+run/0: instruction string-append/5
+run/0: ingredient 0 is a-len
+mem/0: location 1018 is 6
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 13
+mem/0: storing 13 in location 1021
+run/0: instruction string-append/6
+mem/0: new alloc: 1045
+mem/0: storing 1045 in location 1022
+mem/0: location 1021 is 13
+mem/0: array size is 13
+run/0: instruction string-append/7
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1023
+run/0: instruction string-append/8
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1024
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 0
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/12
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/13
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+mem/0: location 1017 is 1000
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 0
+run/0: address to copy is 1001
+run/0: its type is 4
+mem/0: location 1001 is 104
+run/0: product 0 is 104
+mem/0: storing 104 in location 1027
+run/0: instruction string-append/14
+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
+run/0: instruction string-append/15
+run/0: ingredient 0 is i
+mem/0: location 1024 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1024
+run/0: instruction string-append/16
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1023
+run/0: instruction string-append/17
+run/0: ingredient 0 is -8
+run/0: pc now 9
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 1
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/12
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/13
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+mem/0: location 1017 is 1000
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 1
+run/0: address to copy is 1002
+run/0: its type is 4
+mem/0: location 1002 is 101
+run/0: product 0 is 101
+mem/0: storing 101 in location 1027
+run/0: instruction string-append/14
+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
+run/0: instruction string-append/15
+run/0: ingredient 0 is i
+mem/0: location 1024 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1024
+run/0: instruction string-append/16
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1023
+run/0: instruction string-append/17
+run/0: ingredient 0 is -8
+run/0: pc now 9
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 2
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/12
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/13
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+mem/0: location 1017 is 1000
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 2
+run/0: address to copy is 1003
+run/0: its type is 4
+mem/0: location 1003 is 108
+run/0: product 0 is 108
+mem/0: storing 108 in location 1027
+run/0: instruction string-append/14
+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
+run/0: instruction string-append/15
+run/0: ingredient 0 is i
+mem/0: location 1024 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1024
+run/0: instruction string-append/16
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1023
+run/0: instruction string-append/17
+run/0: ingredient 0 is -8
+run/0: pc now 9
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 3
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/12
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/13
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+mem/0: location 1017 is 1000
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 3
+run/0: address to copy is 1004
+run/0: its type is 4
+mem/0: location 1004 is 108
+run/0: product 0 is 108
+mem/0: storing 108 in location 1027
+run/0: instruction string-append/14
+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
+run/0: instruction string-append/15
+run/0: ingredient 0 is i
+mem/0: location 1024 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 4
+mem/0: storing 4 in location 1024
+run/0: instruction string-append/16
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 4
+mem/0: storing 4 in location 1023
+run/0: instruction string-append/17
+run/0: ingredient 0 is -8
+run/0: pc now 9
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 4
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/12
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/13
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+mem/0: location 1017 is 1000
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 4
+run/0: address to copy is 1005
+run/0: its type is 4
+mem/0: location 1005 is 111
+run/0: product 0 is 111
+mem/0: storing 111 in location 1027
+run/0: instruction string-append/14
+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
+run/0: instruction string-append/15
+run/0: ingredient 0 is i
+mem/0: location 1024 is 4
+run/0: ingredient 1 is 1
+run/0: product 0 is 5
+mem/0: storing 5 in location 1024
+run/0: instruction string-append/16
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 4
+run/0: ingredient 1 is 1
+run/0: product 0 is 5
+mem/0: storing 5 in location 1023
+run/0: instruction string-append/17
+run/0: ingredient 0 is -8
+run/0: pc now 9
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 5
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 0
+mem/0: storing 0 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/12
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/13
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
+mem/0: location 1017 is 1000
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 5
+run/0: address to copy is 1006
+run/0: its type is 4
+mem/0: location 1006 is 44
+run/0: product 0 is 44
+mem/0: storing 44 in location 1027
+run/0: instruction string-append/14
+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
+run/0: instruction string-append/15
+run/0: ingredient 0 is i
+mem/0: location 1024 is 5
+run/0: ingredient 1 is 1
+run/0: product 0 is 6
+mem/0: storing 6 in location 1024
+run/0: instruction string-append/16
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 5
+run/0: ingredient 1 is 1
+run/0: product 0 is 6
+mem/0: storing 6 in location 1023
+run/0: instruction string-append/17
+run/0: ingredient 0 is -8
+run/0: pc now 9
+run/0: instruction string-append/10
+run/0: ingredient 0 is i
+mem/0: location 1024 is 6
+run/0: ingredient 1 is a-len
+mem/0: location 1018 is 6
+run/0: product 0 is 1
+mem/0: storing 1 in location 1025
+run/0: instruction string-append/11
+mem/0: location 1025 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 18
+run/0: instruction string-append/19
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1024
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 0
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 0
+run/0: address to copy is 1008
+run/0: its type is 4
+mem/0: location 1008 is 32
+run/0: product 0 is 32
+mem/0: storing 32 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 6
+run/0: ingredient 1 is 1
+run/0: product 0 is 7
+mem/0: storing 7 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 1
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 1
+run/0: address to copy is 1009
+run/0: its type is 4
+mem/0: location 1009 is 119
+run/0: product 0 is 119
+mem/0: storing 119 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 7
+run/0: ingredient 1 is 1
+run/0: product 0 is 8
+mem/0: storing 8 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 2
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 2
+run/0: address to copy is 1010
+run/0: its type is 4
+mem/0: location 1010 is 111
+run/0: product 0 is 111
+mem/0: storing 111 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 8
+run/0: ingredient 1 is 1
+run/0: product 0 is 9
+mem/0: storing 9 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 3
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 3
+run/0: address to copy is 1011
+run/0: its type is 4
+mem/0: location 1011 is 114
+run/0: product 0 is 114
+mem/0: storing 114 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 4
+mem/0: storing 4 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 9
+run/0: ingredient 1 is 1
+run/0: product 0 is 10
+mem/0: storing 10 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 4
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 4
+run/0: address to copy is 1012
+run/0: its type is 4
+mem/0: location 1012 is 108
+run/0: product 0 is 108
+mem/0: storing 108 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 4
+run/0: ingredient 1 is 1
+run/0: product 0 is 5
+mem/0: storing 5 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 10
+run/0: ingredient 1 is 1
+run/0: product 0 is 11
+mem/0: storing 11 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 5
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 5
+run/0: address to copy is 1013
+run/0: its type is 4
+mem/0: location 1013 is 100
+run/0: product 0 is 100
+mem/0: storing 100 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 5
+run/0: ingredient 1 is 1
+run/0: product 0 is 6
+mem/0: storing 6 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 11
+run/0: ingredient 1 is 1
+run/0: product 0 is 12
+mem/0: storing 12 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 6
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 0
+mem/0: storing 0 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 0
+run/0: ingredient 0 is 0
+run/0: jump-if fell through
+run/0: instruction string-append/23
+run/0: ingredient 0 is result
+mem/0: location 1022 is 1045
+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: instruction string-append/24
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
+mem/0: location 1019 is 1007
+run/0: ingredient 1 is {name: "i", value: 8, type: 1, properties: ["i": "integer"]}
+mem/0: location 1024 is 6
+run/0: address to copy is 1014
+run/0: its type is 4
+mem/0: location 1014 is 33
+run/0: product 0 is 33
+mem/0: storing 33 in location 1027
+run/0: instruction string-append/25
+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
+run/0: instruction string-append/26
+run/0: ingredient 0 is i
+mem/0: location 1024 is 6
+run/0: ingredient 1 is 1
+run/0: product 0 is 7
+mem/0: storing 7 in location 1024
+run/0: instruction string-append/27
+run/0: ingredient 0 is result-idx
+mem/0: location 1023 is 12
+run/0: ingredient 1 is 1
+run/0: product 0 is 13
+mem/0: storing 13 in location 1023
+run/0: instruction string-append/28
+run/0: ingredient 0 is -8
+run/0: pc now 20
+run/0: instruction string-append/21
+run/0: ingredient 0 is i
+mem/0: location 1024 is 7
+run/0: ingredient 1 is b-len
+mem/0: location 1020 is 7
+run/0: product 0 is 1
+mem/0: storing 1 in location 1028
+run/0: instruction string-append/22
+mem/0: location 1028 is 1
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 
+run/0: jumping to instruction 29
+run/0: instruction string-append/30
+mem/0: location 1022 is 1045
+run/0: result 0 is 1045
+mem/0: storing 1045 in location 3
+run/0: instruction test-string-append-1/3
+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 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: storing 13 in location 4
+mem/0: storing 104 in location 5
+mem/0: storing 101 in location 6
+mem/0: storing 108 in location 7
+mem/0: storing 108 in location 8
+mem/0: storing 111 in location 9
+mem/0: storing 44 in location 10
+mem/0: storing 32 in location 11
+mem/0: storing 119 in location 12
+mem/0: storing 111 in location 13
+mem/0: storing 114 in location 14
+mem/0: storing 108 in location 15
+mem/0: storing 100 in location 16
+mem/0: storing 33 in location 17
diff --git a/cpp/060string.mu b/cpp/060string.mu
index d81cdf13..3723df2d 100644
--- a/cpp/060string.mu
+++ b/cpp/060string.mu
@@ -323,3 +323,73 @@ scenario integer-to-decimal-digit-negative [
     4 <- 49  # '1'
   ]
 ]
+
+recipe string-append [
+  default-space:address:space <- new location:type, 30:literal
+  # result = new string[a.length + b.length]
+  a:address:array:character <- next-ingredient
+  a-len:integer <- length a:address:array:character/deref
+  b:address:array:character <- next-ingredient
+  b-len:integer <- length b:address:array:character/deref
+  result-len:integer <- add a-len:integer, b-len:integer
+  result:address:array:character <- new character:type, result-len:integer
+  # copy a into result
+  result-idx:integer <- copy 0:literal
+  i:integer <- copy 0:literal
+  {
+    # while i < a.length
+    a-done?:boolean <- greater-or-equal i:integer, a-len:integer
+    break-if a-done?:boolean
+    # result[result-idx] = a[i]
+    out:address:character <- index-address result:address:array:character/deref, result-idx:integer
+    in:character <- index a:address:array:character/deref, i:integer
+    out:address:character/deref <- copy in:character
+    # ++i
+    i:integer <- add i:integer, 1:literal
+    # ++result-idx
+    result-idx:integer <- add result-idx:integer, 1:literal
+    loop
+  }
+  # copy b into result
+  i:integer <- copy 0:literal
+  {
+    # while i < b.length
+    b-done?:boolean <- greater-or-equal i:integer, b-len:integer
+    break-if b-done?:boolean
+    # result[result-idx] = a[i]
+    out:address:character <- index-address result:address:array:character/deref, result-idx:integer
+    in:character <- index b:address:array:character/deref, i:integer
+    out:address:character/deref <- copy in:character
+    # ++i
+    i:integer <- add i:integer, 1:literal
+    # ++result-idx
+    result-idx:integer <- add result-idx:integer, 1:literal
+    loop
+  }
+  reply result:address:array:character
+]
+
+scenario string-append-1 [
+  run [
+    1:address:array:character/raw <- new [hello,]
+    2:address:array:character/raw <- new [ world!]
+    3:address:array:character/raw <- string-append 1:address:array:character/raw, 2:address:array:character/raw
+    4:array:character/raw <- copy 3:address:array:character/raw/deref
+  ]
+  memory should contain [
+    4 <- 13
+    5 <- 104  # 'h'
+    6 <- 101  # 'e'
+    7 <- 108  # 'l'
+    8 <- 108  # 'l'
+    9 <- 111  # 'o'
+    10 <- 44  # ','
+    11 <- 32  # ' '
+    12 <- 119  # 'w'
+    13 <- 111  # 'o'
+    14 <- 114  # 'r'
+    15 <- 108  # 'l'
+    16 <- 100  # 'd'
+    17 <- 33  # '!'
+  ]
+]