about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-04 10:31:52 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-04 10:31:52 -0700
commitde49fb426aa44984d308f5856ec836360ba0bdce (patch)
tree5522203f99d3d387439c4cd0385e0375ccd8ed0d
parenta11d9c4a3375906bf8ae1117c6043776d2f08d17 (diff)
downloadmu-de49fb426aa44984d308f5856ec836360ba0bdce.tar.gz
1248 - syntax for using screens in scenarios
Still ugly as hell.
-rw-r--r--cpp/.traces/check_string_in_memory2
-rw-r--r--cpp/.traces/convert_names_warns1
-rw-r--r--cpp/.traces/integer-to-decimal-digit-positive2
-rw-r--r--cpp/.traces/integer-to-decimal-digit-zero2
-rw-r--r--cpp/.traces/interpolate-at-end2
-rw-r--r--cpp/.traces/interpolate-at-start2
-rw-r--r--cpp/.traces/interpolate-works2
-rw-r--r--cpp/.traces/memory_check_string2
-rw-r--r--cpp/.traces/memory_check_string_length2
-rw-r--r--cpp/.traces/screen_in_scenario899
-rw-r--r--cpp/.traces/screen_in_scenario_error886
-rw-r--r--cpp/.traces/string-append-12
-rw-r--r--cpp/002test.cc4
-rw-r--r--cpp/003trace.cc1
-rw-r--r--cpp/011load.cc1
-rw-r--r--cpp/041name.cc4
-rw-r--r--cpp/042new.cc5
-rw-r--r--cpp/049scenario_helpers.cc34
-rw-r--r--cpp/050scenario.cc23
-rw-r--r--cpp/071print.mu8
-rw-r--r--cpp/072scenario_screen.cc105
21 files changed, 1953 insertions, 36 deletions
diff --git a/cpp/.traces/check_string_in_memory b/cpp/.traces/check_string_in_memory
index 5ebd7a8d..335059f6 100644
--- a/cpp/.traces/check_string_in_memory
+++ b/cpp/.traces/check_string_in_memory
@@ -72,7 +72,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     1:string <- [abc]
   ": "literal-string"]}
-run/0: checking array length at 1
+run/0: checking string length at 1
 run/0: checking location 2
 run/0: checking location 3
 run/0: checking location 4
diff --git a/cpp/.traces/convert_names_warns b/cpp/.traces/convert_names_warns
index 53b84c52..4615bbe6 100644
--- a/cpp/.traces/convert_names_warns
+++ b/cpp/.traces/convert_names_warns
@@ -2,7 +2,6 @@ parse/0: instruction: copy
 parse/0:   ingredient: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 warn/0: use before set: y in main
-warn/0: name not found: y
 name/0: assign x 1
 after-brace/0: recipe main
 after-brace/0: copy ...
diff --git a/cpp/.traces/integer-to-decimal-digit-positive b/cpp/.traces/integer-to-decimal-digit-positive
index 2c711967..d6718be3 100644
--- a/cpp/.traces/integer-to-decimal-digit-positive
+++ b/cpp/.traces/integer-to-decimal-digit-positive
@@ -831,7 +831,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     2:string <- [234]
   ": "literal-string"]}
-run/0: checking array length at 2
+run/0: checking string length at 2
 run/0: checking location 3
 run/0: checking location 4
 run/0: checking location 5
diff --git a/cpp/.traces/integer-to-decimal-digit-zero b/cpp/.traces/integer-to-decimal-digit-zero
index 210d1e48..2c6d63fd 100644
--- a/cpp/.traces/integer-to-decimal-digit-zero
+++ b/cpp/.traces/integer-to-decimal-digit-zero
@@ -71,5 +71,5 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     2:string <- [0]
   ": "literal-string"]}
-run/0: checking array length at 2
+run/0: checking string length at 2
 run/0: checking location 3
diff --git a/cpp/.traces/interpolate-at-end b/cpp/.traces/interpolate-at-end
index 8b432ef7..38e84646 100644
--- a/cpp/.traces/interpolate-at-end
+++ b/cpp/.traces/interpolate-at-end
@@ -931,7 +931,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     4:string <- [hello, abc]
   ": "literal-string"]}
-run/0: checking array length at 4
+run/0: checking string length at 4
 run/0: checking location 5
 run/0: checking location 6
 run/0: checking location 7
diff --git a/cpp/.traces/interpolate-at-start b/cpp/.traces/interpolate-at-start
index f1208a13..2ab1b7d0 100644
--- a/cpp/.traces/interpolate-at-start
+++ b/cpp/.traces/interpolate-at-start
@@ -910,7 +910,7 @@ run/0: memory-should-contain/44 {name: "
     4:string <- [abc, hello!]
     16 <- 0  # out of bounds
   ": "literal-string"]}
-run/0: checking array length at 4
+run/0: checking string length at 4
 run/0: checking location 5
 run/0: checking location 6
 run/0: checking location 7
diff --git a/cpp/.traces/interpolate-works b/cpp/.traces/interpolate-works
index 5e99215f..ae942940 100644
--- a/cpp/.traces/interpolate-works
+++ b/cpp/.traces/interpolate-works
@@ -718,7 +718,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     4:string <- [abc def]
   ": "literal-string"]}
-run/0: checking array length at 4
+run/0: checking string length at 4
 run/0: checking location 5
 run/0: checking location 6
 run/0: checking location 7
diff --git a/cpp/.traces/memory_check_string b/cpp/.traces/memory_check_string
index dfa06bdd..2d49c3c9 100644
--- a/cpp/.traces/memory_check_string
+++ b/cpp/.traces/memory_check_string
@@ -46,7 +46,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     1:string <- [abc]
   ": "literal-string"]}
-run/0: checking array length at 1
+run/0: checking string length at 1
 run/0: checking location 2
 run/0: checking location 3
 run/0: checking location 4
diff --git a/cpp/.traces/memory_check_string_length b/cpp/.traces/memory_check_string_length
index ffcdac6b..af2a030a 100644
--- a/cpp/.traces/memory_check_string_length
+++ b/cpp/.traces/memory_check_string_length
@@ -46,7 +46,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     1:string <- [ab]
   ": "literal-string"]}
-run/0: checking array length at 1
+run/0: checking string length at 1
 warn/0: expected location 1 to contain length 2 of string [ab] but saw 3
 run/0: checking location 2
 run/0: checking location 3
diff --git a/cpp/.traces/screen_in_scenario b/cpp/.traces/screen_in_scenario
new file mode 100644
index 00000000..77089eb9
--- /dev/null
+++ b/cpp/.traces/screen_in_scenario
@@ -0,0 +1,899 @@
+parse/0: instruction: assume-screen
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal", "width": ]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "height": ]}
+parse/0: instruction: run
+parse/0:   ingredient: {name: "
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ", value: 0, type: 0, properties: ["
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ": "literal-string"]}
+parse/0: instruction: screen-should-contain
+parse/0:   ingredient: {name: "
+  #  01234
+    .a    .
+    .     .
+    .     .
+  ", value: 0, type: 0, properties: ["
+  #  01234
+    .a    .
+    .     .
+    .     .
+  ": "literal-string"]}
+after-brace/0: recipe screen-in-scenario
+after-brace/0: assume-screen ...
+after-brace/0: run ...
+after-brace/0: screen-should-contain ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: screen-in-scenario
+run/0: instruction screen-in-scenario/0
+run/0: {name: "screen", value: 999, type: 2, properties: ["screen": "address"]} <- assume-screen/115 {name: "5", value: 5, type: 0, properties: ["5": "literal", "width": ]}, {name: "3", value: 3, type: 0, properties: ["3": "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/42 {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/42 {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/25 {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/30 
+run/0: product 0 is 5
+mem/0: location 1003 is 1032
+mem/0: storing 5 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/25 {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/30 
+run/0: product 0 is 3
+mem/0: location 1004 is 1031
+mem/0: storing 3 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/25 {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/1 {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/25 {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/1 {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/4 {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 5
+run/0: ingredient 1 is height
+mem/0: location 1004 is 1031
+mem/0: location 1031 is 3
+run/0: ingredient 1 is 3
+run/0: product 0 is 15
+mem/0: storing 15 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/25 {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/42 {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
+mem/0: location 1007 is 15
+mem/0: array size is 15
+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/116 {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/42 {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: 1052
+run/0: instruction clear-screen/1
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1054
+run/0: instruction clear-screen/3
+run/0: break-unless/12 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: "", value: 12, type: , properties: ["": ]}
+mem/0: location 1054 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/24 {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 1054 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 1055
+run/0: instruction clear-screen/5
+run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length/28 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
+mem/0: location 1055 is 1036
+mem/0: storing 15 in location 1056
+run/0: instruction clear-screen/6
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- copy/1 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1057
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal/16 {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 1057 is 0
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 0
+run/0: address to copy is 1037
+run/0: product 0 is 1037
+mem/0: storing 1037 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 1
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 1
+run/0: address to copy is 1038
+run/0: product 0 is 1038
+mem/0: storing 1038 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 2
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 2
+run/0: address to copy is 1039
+run/0: product 0 is 1039
+mem/0: storing 1039 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 3
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 3
+run/0: address to copy is 1040
+run/0: product 0 is 1040
+mem/0: storing 1040 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 4
+mem/0: storing 4 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 4
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 4
+run/0: address to copy is 1041
+run/0: product 0 is 1041
+mem/0: storing 1041 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 4
+run/0: ingredient 1 is 1
+run/0: product 0 is 5
+mem/0: storing 5 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 5
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 5
+run/0: address to copy is 1042
+run/0: product 0 is 1042
+mem/0: storing 1042 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 5
+run/0: ingredient 1 is 1
+run/0: product 0 is 6
+mem/0: storing 6 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 6
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 6
+run/0: address to copy is 1043
+run/0: product 0 is 1043
+mem/0: storing 1043 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1043
+mem/0: storing 0 in location 1043
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 6
+run/0: ingredient 1 is 1
+run/0: product 0 is 7
+mem/0: storing 7 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 7
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 7
+run/0: address to copy is 1044
+run/0: product 0 is 1044
+mem/0: storing 1044 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1044
+mem/0: storing 0 in location 1044
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 7
+run/0: ingredient 1 is 1
+run/0: product 0 is 8
+mem/0: storing 8 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 8
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 8
+run/0: address to copy is 1045
+run/0: product 0 is 1045
+mem/0: storing 1045 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1045
+mem/0: storing 0 in location 1045
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 8
+run/0: ingredient 1 is 1
+run/0: product 0 is 9
+mem/0: storing 9 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 9
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 9
+run/0: address to copy is 1046
+run/0: product 0 is 1046
+mem/0: storing 1046 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1046
+mem/0: storing 0 in location 1046
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 9
+run/0: ingredient 1 is 1
+run/0: product 0 is 10
+mem/0: storing 10 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 10
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 10
+run/0: address to copy is 1047
+run/0: product 0 is 1047
+mem/0: storing 1047 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1047
+mem/0: storing 0 in location 1047
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 10
+run/0: ingredient 1 is 1
+run/0: product 0 is 11
+mem/0: storing 11 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 11
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 11
+run/0: address to copy is 1048
+run/0: product 0 is 1048
+mem/0: storing 1048 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1048
+mem/0: storing 0 in location 1048
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 11
+run/0: ingredient 1 is 1
+run/0: product 0 is 12
+mem/0: storing 12 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 12
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 12
+run/0: address to copy is 1049
+run/0: product 0 is 1049
+mem/0: storing 1049 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1049
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 12
+run/0: ingredient 1 is 1
+run/0: product 0 is 13
+mem/0: storing 13 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 13
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 13
+run/0: address to copy is 1050
+run/0: product 0 is 1050
+mem/0: storing 1050 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1050
+mem/0: storing 0 in location 1050
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 13
+run/0: ingredient 1 is 1
+run/0: product 0 is 14
+mem/0: storing 14 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 14
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 14
+run/0: address to copy is 1051
+run/0: product 0 is 1051
+mem/0: storing 1051 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1051
+mem/0: storing 0 in location 1051
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 14
+run/0: ingredient 1 is 1
+run/0: product 0 is 15
+mem/0: storing 15 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 15
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 1
+mem/0: storing 1 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+mem/0: location 1054 is 1031
+run/0: instruction init-fake-screen/14
+run/0: reply/33 {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 999
+run/0: instruction screen-in-scenario/1
+run/0: run/43 {name: "
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ", value: 0, type: 0, properties: ["
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ": "literal-string"]}
+parse/0: instruction: print-character
+parse/0:   ingredient: {name: "screen", value: 0, type: 2, properties: ["screen": "address"]}
+parse/0:   ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]}
+parse/0:   product: {name: "screen", value: 0, type: 2, properties: ["screen": "address"]}
+after-brace/0: recipe run1002
+after-brace/0: print-character ...
+run/0: instruction run1002/0
+run/0: {name: "screen", value: 999, type: 2, properties: ["screen": "address"]} <- print-character/117 {name: "screen", value: 999, type: 2, properties: ["screen": "address"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
+mem/0: location 999 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/42 {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: 1083
+run/0: instruction print-character/1
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1085
+run/0: instruction print-character/2
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
+run/0: product 0 is 97
+mem/0: storing 97 in location 1086
+run/0: instruction print-character/4
+run/0: break-unless/12 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: "", value: 14, type: , properties: ["": ]}
+mem/0: location 1085 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/25 {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 1085 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 1087
+run/0: instruction print-character/6
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {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 1085 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 1088
+run/0: instruction print-character/7
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {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 1085 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 5
+run/0: product 0 is 5
+mem/0: storing 5 in location 1089
+run/0: instruction print-character/8
+run/0: {name: "index", value: 6, type: 1, properties: ["index": "integer"]} <- multiply/4 {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 1087 is 1033
+mem/0: location 1033 is 0
+run/0: ingredient 1 is width
+mem/0: location 1089 is 5
+run/0: ingredient 1 is 5
+run/0: product 0 is 0
+mem/0: storing 0 in location 1090
+run/0: instruction print-character/9
+run/0: {name: "index", value: 6, type: 1, properties: ["index": "integer"]} <- add/2 {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 1090 is 0
+run/0: ingredient 1 is column
+mem/0: location 1088 is 1034
+mem/0: location 1034 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1090
+run/0: instruction print-character/10
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {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 1085 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 1091
+run/0: instruction print-character/11
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {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 1091 is 1036
+run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+mem/0: location 1090 is 0
+run/0: address to copy is 1037
+run/0: product 0 is 1037
+mem/0: storing 1037 in location 1092
+run/0: instruction print-character/12
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character", "deref": ]} <- copy/1 {name: "c", value: 2, type: 4, properties: ["c": "character"]}
+run/0: ingredient 0 is c
+mem/0: location 1086 is 97
+mem/0: location 1092 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/13 {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 1088 is 1034
+mem/0: location 1034 is 0
+run/0: ingredient 1 is width
+mem/0: location 1089 is 5
+run/0: product 0 is 0
+mem/0: storing 0 in location 1093
+run/0: instruction print-character/15
+run/0: break-if/11 {name: "at-right?", value: 9, type: 3, properties: ["at-right?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
+mem/0: location 1093 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/2 {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 1088 is 1034
+mem/0: location 1034 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: location 1088 is 1034
+mem/0: storing 1 in location 1034
+run/0: instruction print-character/18
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+mem/0: location 1085 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 999
+run/0: instruction screen-in-scenario/2
+run/0: screen-should-contain/59 {name: "
+  #  01234
+    .a    .
+    .     .
+    .     .
+  ", value: 0, type: 0, properties: ["
+  #  01234
+    .a    .
+    .     .
+    .     .
+  ": "literal-string"]}
+run/0: checking screen size at 1036
+run/0: checking location 1037
+run/0: checking location 1038
+run/0: checking location 1039
+run/0: checking location 1040
+run/0: checking location 1041
+run/0: checking location 1042
+run/0: checking location 1043
+run/0: checking location 1044
+run/0: checking location 1045
+run/0: checking location 1046
+run/0: checking location 1047
+run/0: checking location 1048
+run/0: checking location 1049
+run/0: checking location 1050
+run/0: checking location 1051
diff --git a/cpp/.traces/screen_in_scenario_error b/cpp/.traces/screen_in_scenario_error
new file mode 100644
index 00000000..570e2cc5
--- /dev/null
+++ b/cpp/.traces/screen_in_scenario_error
@@ -0,0 +1,886 @@
+parse/0: instruction: assume-screen
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal", "width": ]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "height": ]}
+parse/0: instruction: run
+parse/0:   ingredient: {name: "
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ", value: 0, type: 0, properties: ["
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ": "literal-string"]}
+parse/0: instruction: screen-should-contain
+parse/0:   ingredient: {name: "
+  #  01234
+    .b    .
+    .     .
+    .     .
+  ", value: 0, type: 0, properties: ["
+  #  01234
+    .b    .
+    .     .
+    .     .
+  ": "literal-string"]}
+after-brace/0: recipe screen-in-scenario-error
+after-brace/0: assume-screen ...
+after-brace/0: run ...
+after-brace/0: screen-should-contain ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: screen-in-scenario-error
+run/0: instruction screen-in-scenario-error/0
+run/0: {name: "screen", value: 999, type: 2, properties: ["screen": "address"]} <- assume-screen/115 {name: "5", value: 5, type: 0, properties: ["5": "literal", "width": ]}, {name: "3", value: 3, type: 0, properties: ["3": "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/42 {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/42 {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/25 {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/30 
+run/0: product 0 is 5
+mem/0: location 1003 is 1032
+mem/0: storing 5 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/25 {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/30 
+run/0: product 0 is 3
+mem/0: location 1004 is 1031
+mem/0: storing 3 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/25 {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/1 {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/25 {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/1 {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/4 {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 5
+run/0: ingredient 1 is height
+mem/0: location 1004 is 1031
+mem/0: location 1031 is 3
+run/0: ingredient 1 is 3
+run/0: product 0 is 15
+mem/0: storing 15 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/25 {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/42 {name: "character", value: 0, type: 0, properties: ["character": "literal"]}, {name: "bufsize", value: 6, type: 1, properties: ["bufsize": "integer"]}
+mem/0: location 1007 is 15
+mem/0: array size is 15
+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/116 {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/42 {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: 1052
+run/0: instruction clear-screen/1
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1054
+run/0: instruction clear-screen/3
+run/0: break-unless/12 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: "", value: 12, type: , properties: ["": ]}
+mem/0: location 1054 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/24 {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 1054 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 1055
+run/0: instruction clear-screen/5
+run/0: {name: "max", value: 3, type: 1, properties: ["max": "integer"]} <- length/28 {name: "buf", value: 2, type: 2-5-4, properties: ["buf": "address":"array":"character", "deref": ]}
+mem/0: location 1055 is 1036
+mem/0: storing 15 in location 1056
+run/0: instruction clear-screen/6
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- copy/1 {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1057
+run/0: instruction clear-screen/8
+run/0: {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal/16 {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 1057 is 0
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 0
+run/0: address to copy is 1037
+run/0: product 0 is 1037
+mem/0: storing 1037 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 1
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 1
+run/0: address to copy is 1038
+run/0: product 0 is 1038
+mem/0: storing 1038 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: storing 2 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 2
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 2
+run/0: address to copy is 1039
+run/0: product 0 is 1039
+mem/0: storing 1039 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: storing 3 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 3
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 3
+run/0: address to copy is 1040
+run/0: product 0 is 1040
+mem/0: storing 1040 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 3
+run/0: ingredient 1 is 1
+run/0: product 0 is 4
+mem/0: storing 4 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 4
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 4
+run/0: address to copy is 1041
+run/0: product 0 is 1041
+mem/0: storing 1041 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 4
+run/0: ingredient 1 is 1
+run/0: product 0 is 5
+mem/0: storing 5 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 5
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 5
+run/0: address to copy is 1042
+run/0: product 0 is 1042
+mem/0: storing 1042 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 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/2 {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 1057 is 5
+run/0: ingredient 1 is 1
+run/0: product 0 is 6
+mem/0: storing 6 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 6
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 6
+run/0: address to copy is 1043
+run/0: product 0 is 1043
+mem/0: storing 1043 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1043
+mem/0: storing 0 in location 1043
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 6
+run/0: ingredient 1 is 1
+run/0: product 0 is 7
+mem/0: storing 7 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 7
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 7
+run/0: address to copy is 1044
+run/0: product 0 is 1044
+mem/0: storing 1044 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1044
+mem/0: storing 0 in location 1044
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 7
+run/0: ingredient 1 is 1
+run/0: product 0 is 8
+mem/0: storing 8 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 8
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 8
+run/0: address to copy is 1045
+run/0: product 0 is 1045
+mem/0: storing 1045 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1045
+mem/0: storing 0 in location 1045
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 8
+run/0: ingredient 1 is 1
+run/0: product 0 is 9
+mem/0: storing 9 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 9
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 9
+run/0: address to copy is 1046
+run/0: product 0 is 1046
+mem/0: storing 1046 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1046
+mem/0: storing 0 in location 1046
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 9
+run/0: ingredient 1 is 1
+run/0: product 0 is 10
+mem/0: storing 10 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 10
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 10
+run/0: address to copy is 1047
+run/0: product 0 is 1047
+mem/0: storing 1047 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1047
+mem/0: storing 0 in location 1047
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 10
+run/0: ingredient 1 is 1
+run/0: product 0 is 11
+mem/0: storing 11 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 11
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 11
+run/0: address to copy is 1048
+run/0: product 0 is 1048
+mem/0: storing 1048 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1048
+mem/0: storing 0 in location 1048
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 11
+run/0: ingredient 1 is 1
+run/0: product 0 is 12
+mem/0: storing 12 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 12
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 12
+run/0: address to copy is 1049
+run/0: product 0 is 1049
+mem/0: storing 1049 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1049
+mem/0: storing 0 in location 1049
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 12
+run/0: ingredient 1 is 1
+run/0: product 0 is 13
+mem/0: storing 13 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 13
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 13
+run/0: address to copy is 1050
+run/0: product 0 is 1050
+mem/0: storing 1050 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1050
+mem/0: storing 0 in location 1050
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 13
+run/0: ingredient 1 is 1
+run/0: product 0 is 14
+mem/0: storing 14 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 14
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 0
+mem/0: storing 0 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/27 {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 1055 is 1036
+run/0: ingredient 1 is {name: "i", value: 4, type: 1, properties: ["i": "integer"]}
+mem/0: location 1057 is 14
+run/0: address to copy is 1051
+run/0: product 0 is 1051
+mem/0: storing 1051 in location 1059
+run/0: instruction clear-screen/11
+run/0: {name: "c", value: 6, type: 2-4, properties: ["c": "address":"character", "deref": ]} <- copy/1 {name: " ", value: 0, type: 0, properties: [" ": "literal-string"]}
+run/0: ingredient 0 is  
+mem/0: location 1059 is 1051
+mem/0: storing 0 in location 1051
+run/0: instruction clear-screen/12
+run/0: {name: "i", value: 4, type: 1, properties: ["i": "integer"]} <- add/2 {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 1057 is 14
+run/0: ingredient 1 is 1
+run/0: product 0 is 15
+mem/0: storing 15 in location 1057
+run/0: instruction clear-screen/13
+run/0: loop/10 {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/16 {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 1057 is 15
+run/0: ingredient 1 is max
+mem/0: location 1056 is 15
+run/0: product 0 is 1
+mem/0: storing 1 in location 1058
+run/0: instruction clear-screen/9
+run/0: break-if/11 {name: "done?", value: 5, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 4, type: , properties: ["": ]}
+mem/0: location 1058 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/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+mem/0: location 1054 is 1031
+run/0: instruction init-fake-screen/14
+run/0: reply/33 {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 999
+run/0: instruction screen-in-scenario-error/1
+run/0: run/43 {name: "
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ", value: 0, type: 0, properties: ["
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ": "literal-string"]}
+parse/0: instruction: print-character
+parse/0:   ingredient: {name: "screen", value: 0, type: 2, properties: ["screen": "address"]}
+parse/0:   ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]}
+parse/0:   product: {name: "screen", value: 0, type: 2, properties: ["screen": "address"]}
+after-brace/0: recipe run1001
+after-brace/0: print-character ...
+run/0: instruction run1001/0
+run/0: {name: "screen", value: 999, type: 2, properties: ["screen": "address"]} <- print-character/117 {name: "screen", value: 999, type: 2, properties: ["screen": "address"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]}
+mem/0: location 999 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/42 {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: 1083
+run/0: instruction print-character/1
+run/0: {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]} <- next-ingredient/30 
+run/0: product 0 is 1031
+mem/0: storing 1031 in location 1085
+run/0: instruction print-character/2
+run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 
+run/0: product 0 is 97
+mem/0: storing 97 in location 1086
+run/0: instruction print-character/4
+run/0: break-unless/12 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen"]}, {name: "", value: 14, type: , properties: ["": ]}
+mem/0: location 1085 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/25 {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 1085 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 1087
+run/0: instruction print-character/6
+run/0: {name: "column", value: 4, type: 2-1, properties: ["column": "address":"integer"]} <- get-address/25 {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 1085 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 1088
+run/0: instruction print-character/7
+run/0: {name: "width", value: 5, type: 1, properties: ["width": "integer"]} <- get/24 {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 1085 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 5
+run/0: product 0 is 5
+mem/0: storing 5 in location 1089
+run/0: instruction print-character/8
+run/0: {name: "index", value: 6, type: 1, properties: ["index": "integer"]} <- multiply/4 {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 1087 is 1033
+mem/0: location 1033 is 0
+run/0: ingredient 1 is width
+mem/0: location 1089 is 5
+run/0: ingredient 1 is 5
+run/0: product 0 is 0
+mem/0: storing 0 in location 1090
+run/0: instruction print-character/9
+run/0: {name: "index", value: 6, type: 1, properties: ["index": "integer"]} <- add/2 {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 1090 is 0
+run/0: ingredient 1 is column
+mem/0: location 1088 is 1034
+mem/0: location 1034 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1090
+run/0: instruction print-character/10
+run/0: {name: "buf", value: 7, type: 2-5-4, properties: ["buf": "address":"array":"character"]} <- get/24 {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 1085 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 1091
+run/0: instruction print-character/11
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character"]} <- index-address/27 {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 1091 is 1036
+run/0: ingredient 1 is {name: "index", value: 6, type: 1, properties: ["index": "integer"]}
+mem/0: location 1090 is 0
+run/0: address to copy is 1037
+run/0: product 0 is 1037
+mem/0: storing 1037 in location 1092
+run/0: instruction print-character/12
+run/0: {name: "cursor", value: 8, type: 2-4, properties: ["cursor": "address":"character", "deref": ]} <- copy/1 {name: "c", value: 2, type: 4, properties: ["c": "character"]}
+run/0: ingredient 0 is c
+mem/0: location 1086 is 97
+mem/0: location 1092 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/13 {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 1088 is 1034
+mem/0: location 1034 is 0
+run/0: ingredient 1 is width
+mem/0: location 1089 is 5
+run/0: product 0 is 0
+mem/0: storing 0 in location 1093
+run/0: instruction print-character/15
+run/0: break-if/11 {name: "at-right?", value: 9, type: 3, properties: ["at-right?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]}
+mem/0: location 1093 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/2 {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 1088 is 1034
+mem/0: location 1034 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: location 1088 is 1034
+mem/0: storing 1 in location 1034
+run/0: instruction print-character/18
+run/0: reply/33 {name: "x", value: 1, type: 2-11, properties: ["x": "address":"screen", "same-as-ingredient": "0"]}
+mem/0: location 1085 is 1031
+run/0: result 0 is 1031
+mem/0: storing 1031 in location 999
+run/0: instruction screen-in-scenario-error/2
+run/0: screen-should-contain/59 {name: "
+  #  01234
+    .b    .
+    .     .
+    .     .
+  ", value: 0, type: 0, properties: ["
+  #  01234
+    .b    .
+    .     .
+    .     .
+  ": "literal-string"]}
+run/0: checking screen size at 1036
+run/0: checking location 1037
+warn/0: expected screen location (0, 0) to contain 'b' instead of 'a'
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
index 97dec546..f5362cf9 100644
--- a/cpp/.traces/string-append-1
+++ b/cpp/.traces/string-append-1
@@ -921,7 +921,7 @@ run/0: memory-should-contain/44 {name: "
   ", value: 0, type: 0, properties: ["
     4:string <- [hello, world!]
   ": "literal-string"]}
-run/0: checking array length at 4
+run/0: checking string length at 4
 run/0: checking location 5
 run/0: checking location 6
 run/0: checking location 7
diff --git a/cpp/002test.cc b/cpp/002test.cc
index fa91c0a7..3daa1aed 100644
--- a/cpp/002test.cc
+++ b/cpp/002test.cc
@@ -37,6 +37,9 @@ long Num_failures = 0;
     return;  /* Currently we stop at the very first failure. */ \
   }
 
+:(before "End Setup")
+Passed = true;
+
 :(before "End Commandline Parsing")
 if (argc > 1 && is_equal(argv[1], "test")) {
   Run_tests = true;  --argc;  ++argv;  // shift 'test' out of commandline args
@@ -69,7 +72,6 @@ void run_test(size_t i) {
     return;
   }
   setup();
-  Passed = true;
   // End Test Setup
   (*Tests[i])();
   teardown();
diff --git a/cpp/003trace.cc b/cpp/003trace.cc
index e87fe1d0..5a275154 100644
--- a/cpp/003trace.cc
+++ b/cpp/003trace.cc
@@ -88,6 +88,7 @@
 :(before "End Tracing")
 bool Hide_warnings = false;
 :(before "End Setup")
+//? cerr << "AAA setup\n"; //? 2
 Hide_warnings = false;
 
 :(before "End Tracing")
diff --git a/cpp/011load.cc b/cpp/011load.cc
index 3308863e..cee2c493 100644
--- a/cpp/011load.cc
+++ b/cpp/011load.cc
@@ -62,6 +62,7 @@ recipe_number add_recipe(istream& in) {
 
   instruction curr;
   while (next_instruction(in, &curr)) {
+    // End Rewrite Instruction(curr)
 //?     if (!curr.products.empty()) cout << curr.products[0].to_string() << '\n'; //? 1
     Recipe[r].steps.push_back(curr);
   }
diff --git a/cpp/041name.cc b/cpp/041name.cc
index ac7c751c..23972393 100644
--- a/cpp/041name.cc
+++ b/cpp/041name.cc
@@ -30,7 +30,9 @@ for (size_t i = 0; i < recently_added_recipes.size(); ++i) {
 :(code)
 void transform_names(const recipe_number r) {
   map<string, int>& names = Name[r];
-  int curr_idx = 1;
+  // store the indices 'used' so far in the map
+  int& curr_idx = names[""];
+  ++curr_idx;  // avoid using index 0, benign skip in some other cases
 //?   cout << "Recipe " << r << ": " << Recipe[r].name << '\n'; //? 3
 //?   cout << Recipe[r].steps.size() << '\n'; //? 2
   for (size_t i = 0; i < Recipe[r].steps.size(); ++i) {
diff --git a/cpp/042new.cc b/cpp/042new.cc
index e1dc7d36..e901b2a9 100644
--- a/cpp/042new.cc
+++ b/cpp/042new.cc
@@ -11,10 +11,11 @@ recipe main [
 +mem: storing 0 in location 3
 
 :(before "End Globals")
-size_t Memory_allocated_until = 1000;
+size_t Reserved_for_tests = 1000;
+size_t Memory_allocated_until = Reserved_for_tests;
 size_t Initial_memory_per_routine = 100000;
 :(before "End Setup")
-Memory_allocated_until = 1000;
+Memory_allocated_until = Reserved_for_tests;
 Initial_memory_per_routine = 100000;
 :(before "End routine Fields")
 size_t alloc, alloc_max;
diff --git a/cpp/049scenario_helpers.cc b/cpp/049scenario_helpers.cc
index c4a5cb54..8e125a8f 100644
--- a/cpp/049scenario_helpers.cc
+++ b/cpp/049scenario_helpers.cc
@@ -23,7 +23,15 @@ case RUN: {
   tmp << "recipe run" << Next_recipe_number << " [ " << current_instruction().ingredients[0].name << " ]";
 //?   Show_rest_of_stream = true; //? 1
   vector<recipe_number> tmp_recipe = load(tmp.str());
+  // Predefined Scenario Locals
+//?   cout << "mapping local screen in recipe " << tmp_recipe[0] << '\n'; //? 1
+  Name[tmp_recipe[0]]["screen"] = Reserved_for_tests-1;
+  // End Predefined Scenario Locals
   transform_all();
+  // There's a restriction on the number of variables 'run' can use, so that
+  // it can avoid colliding with the dynamic allocator in case it doesn't
+  // initialize a default-space.
+  assert(Name[tmp_recipe[0]][""] < Reserved_for_tests-1);
 //?   cout << tmp_recipe[0] << ' ' << Recipe_number["main"] << '\n'; //? 1
   Current_routine->calls.push(call(tmp_recipe[0]));
   continue;  // not done with caller; don't increment current_step_index()
@@ -102,19 +110,27 @@ void check_type(const string& lhs, istream& in) {
     skip_whitespace_and_comments(in);
     string literal = next_word(in);
     size_t address = x.value;
-    trace("run") << "checking array length at " << address;
-    if (Memory[address] != static_cast<signed>(literal.size()-2))  // exclude quoting brackets
-      raise << "expected location " << address << " to contain length " << literal.size()-2 << " of string " << literal << " but saw " << Memory[address] << '\n';
-    for (size_t i = 1; i < literal.size()-1; ++i) {
-      trace("run") << "checking location " << address+i;
-      if (Memory[address+i] != literal[i])
-        raise << "expected location " << (address+i) << " to contain " << literal[i] << " but saw " << Memory[address+i] << '\n';
-    }
+    // exclude quoting brackets
+    assert(literal[0] == '[');  literal.erase(0, 1);
+    assert(literal[literal.size()-1] == ']');  literal.erase(literal.size()-1);
+    check_string(address, literal);
     return;
   }
   raise << "don't know how to check memory for " << lhs << '\n';
 }
 
+void check_string(size_t address, const string& literal) {
+  trace("run") << "checking string length at " << address;
+  if (Memory[address] != static_cast<signed>(literal.size()))
+    raise << "expected location " << address << " to contain length " << literal.size() << " of string [" << literal << "] but saw " << Memory[address] << '\n';
+  ++address;  // now skip length
+  for (size_t i = 0; i < literal.size(); ++i) {
+    trace("run") << "checking location " << address+i;
+    if (Memory[address+i] != literal[i])
+      raise << "expected location " << (address+i) << " to contain " << literal[i] << " but saw " << Memory[address+i] << '\n';
+  }
+}
+
 :(scenario memory_check_multiple)
 % Hide_warnings = true;
 recipe main [
@@ -148,7 +164,7 @@ recipe main [
     1:string <- [abc]
   ]
 ]
-+run: checking array length at 1
++run: checking string length at 1
 +run: checking location 2
 +run: checking location 3
 +run: checking location 4
diff --git a/cpp/050scenario.cc b/cpp/050scenario.cc
index 90a4fe64..bc60fcbc 100644
--- a/cpp/050scenario.cc
+++ b/cpp/050scenario.cc
@@ -79,26 +79,22 @@ scenario parse_scenario(istream& in) {
 }
 
 void run_mu_scenario(const scenario& s) {
-  setup();
-  // In this layer we're writing tangle scenarios about mu scenarios.
-  // Don't need to set Trace_file and Trace_stream in that situation.
-  // Hackily simulate a conditional START_TRACING_UNTIL_END_OF_SCOPE.
-  bool temporary_trace_file = Trace_file.empty();
-  if (temporary_trace_file) Trace_file = s.name;
-//?   cerr << Trace_file << '\n'; //? 1
-  bool delete_trace_stream = !Trace_stream;
-  if (delete_trace_stream) Trace_stream = new trace_stream;
-//?   START_TRACING_UNTIL_END_OF_SCOPE;
+  bool not_already_inside_test = !Trace_stream;
+  if (not_already_inside_test) {
+    Trace_file = s.name;
+    Trace_stream = new trace_stream;
+    setup();
+  }
   run("recipe "+s.name+" [ " + s.to_run + " ]");
-  teardown();
-  if (delete_trace_stream) {
+  if (not_already_inside_test) {
+    teardown();
     ofstream fout((Trace_dir+Trace_file).c_str());
     fout << Trace_stream->readable_contents("");
     fout.close();
     delete Trace_stream;
     Trace_stream = NULL;
+    Trace_file = "";
   }
-  if (temporary_trace_file) Trace_file = "";
 }
 
 :(before "End Command Handlers")
@@ -110,6 +106,7 @@ else if (command == "scenario") {
 time_t mu_time; time(&mu_time);
 cerr << "\nMu tests: " << ctime(&mu_time);
 for (size_t i = 0; i < Scenarios.size(); ++i) {
+//?   cerr << Passed << '\n'; //? 1
   run_mu_scenario(Scenarios[i]);
   if (Passed) cerr << ".";
 }
diff --git a/cpp/071print.mu b/cpp/071print.mu
index 6789ff89..2bf1df0b 100644
--- a/cpp/071print.mu
+++ b/cpp/071print.mu
@@ -56,9 +56,14 @@ recipe print-character [
   default-space:address:array:location <- new location:type, 30:literal
   x:address:screen <- next-ingredient
   c:character <- next-ingredient
+#?   $print x:address:character #? 1
+#?   $print [ print-character #? 1
+#? ] #? 1
   {
     # if x exists
     break-unless x:address:screen
+#?   $print [print-character2 #? 1
+#? ] #? 1
     # save character in fake screen
     row:address:integer <- get-address x:address:screen/deref, cursor-row:offset
     column:address:integer <- get-address x:address:screen/deref, cursor-column:offset
@@ -67,6 +72,9 @@ recipe print-character [
     index:integer <- add index:integer, column:address:integer/deref
     buf:address:array:character <- get x:address:screen/deref, data:offset
     cursor:address:character <- index-address buf:address:array:character/deref, index:integer
+#?     $print cursor:address:character #? 1
+#?     $print [ #? 1
+#? ] #? 1
     cursor:address:character/deref <- copy c:character  # todo: newline, etc.
     # increment column unless it's already all the way to the right
     {
diff --git a/cpp/072scenario_screen.cc b/cpp/072scenario_screen.cc
new file mode 100644
index 00000000..a0f9c78e
--- /dev/null
+++ b/cpp/072scenario_screen.cc
@@ -0,0 +1,105 @@
+//: Some cleaner way to manipulate and check the screen in scenarios.
+
+:(scenarios run_mu_scenario)
+:(scenario screen_in_scenario)
+scenario screen-in-scenario [
+#?   $start-tracing
+  assume-screen 5:literal/width, 3:literal/height
+  run [
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ]
+  screen-should-contain [
+  #  01234
+    .a    .
+    .     .
+    .     .
+  ]
+#?   $exit
+]
+
+:(scenario screen_in_scenario_error)
+#? % cerr << "AAA\n";
+% Hide_warnings = true;
+scenario screen-in-scenario-error [
+  assume-screen 5:literal/width, 3:literal/height
+  run [
+    screen:address <- print-character screen:address, 97:literal  # 'a'
+  ]
+  screen-should-contain [
+  #  01234
+    .b    .
+    .     .
+    .     .
+  ]
+]
++warn: expected screen location (0, 0) to contain 'b' instead of 'a'
+
+:(before "End Rewrite Instruction(curr)")
+// rewrite `assume-screen width, height` to
+// `screen:address <- init-fake-screen width, height`
+//? cout << "before: " << curr.to_string() << '\n'; //? 1
+if (curr.name == "assume-screen") {
+  curr.operation = Recipe_number["init-fake-screen"];
+  assert(curr.products.empty());
+  curr.products.push_back(reagent("screen:address"));
+  curr.products[0].set_value(Reserved_for_tests-1);
+//? cout << "after: " << curr.to_string() << '\n'; //? 1
+//? cout << "AAA " << Recipe_number["init-fake-screen"] << '\n'; //? 1
+}
+
+//: screen-should-contain is a regular instruction
+:(before "End Primitive Recipe Declarations")
+SCREEN_SHOULD_CONTAIN,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["screen-should-contain"] = SCREEN_SHOULD_CONTAIN;
+:(before "End Primitive Recipe Implementations")
+case SCREEN_SHOULD_CONTAIN: {
+//?   cout << "AAA\n"; //? 1
+  check_screen(current_instruction().ingredients[0].name);
+  break;
+}
+
+:(code)
+void check_screen(const string& contents) {
+  static const int screen_variable = Reserved_for_tests-1;
+  assert(!Current_routine->calls.top().default_space);  // not supported
+  size_t screen_location = Memory[screen_variable];
+  int data_offset = find_element_name(Type_number["screen"], "data");
+  assert(data_offset >= 0);
+  size_t screen_data_location = screen_location+data_offset;  // type: address:array:character
+  size_t screen_data_start = Memory[screen_data_location];  // type: array:character
+  int width_offset = find_element_name(Type_number["screen"], "num-columns");
+  size_t screen_width = Memory[screen_location+width_offset];
+  int height_offset = find_element_name(Type_number["screen"], "num-rows");
+  size_t screen_height = Memory[screen_location+height_offset];
+  string expected_contents;
+  istringstream in(contents);
+  in >> std::noskipws;
+  for (size_t row = 0; row < screen_height; ++row) {
+    skip_whitespace_and_comments(in);
+    assert(!in.eof());
+    assert(in.get() == '.');
+    for (size_t column = 0; column < screen_width; ++column) {
+      assert(!in.eof());
+      expected_contents += in.get();
+    }
+    assert(in.get() == '.');
+  }
+  skip_whitespace_and_comments(in);
+//?   assert(in.get() == ']');
+  trace("run") << "checking screen size at " << screen_data_start;
+//?   cout << expected_contents.size() << '\n'; //? 1
+  if (Memory[screen_data_start] > static_cast<signed>(expected_contents.size()))
+    raise << "expected contents are larger than screen size " << Memory[screen_data_start] << '\n';
+  ++screen_data_start;  // now skip length
+  for (size_t i = 0; i < expected_contents.size(); ++i) {
+    trace("run") << "checking location " << screen_data_start+i;
+    if ((!Memory[screen_data_start+i] && !isspace(expected_contents[i]))  // uninitialized memory => spaces
+        || (Memory[screen_data_start+i] && Memory[screen_data_start+i] != expected_contents[i])) {
+//?       cerr << "CCC " << Trace_stream << " " << Hide_warnings << '\n'; //? 1
+      raise << "expected screen location (" << i/screen_width << ", " << i%screen_width << ") to contain '" << expected_contents[i] << "' instead of '" << static_cast<char>(Memory[screen_data_start+i]) << "'\n";
+      Passed = false;
+      return;
+    }
+  }
+}