diff options
-rw-r--r-- | 029debug.cc | 5 | ||||
-rw-r--r-- | 060string.mu | 35 | ||||
-rw-r--r-- | 061channel.mu | 14 | ||||
-rw-r--r-- | 071print.mu | 18 | ||||
-rw-r--r-- | chessboard.mu | 82 | ||||
-rw-r--r-- | edit.mu | 36 |
6 files changed, 54 insertions, 136 deletions
diff --git a/029debug.cc b/029debug.cc index e185a314..753375cc 100644 --- a/029debug.cc +++ b/029debug.cc @@ -9,7 +9,10 @@ case _PRINT: { for (long long int i = 0; i < SIZE(ingredients); ++i) { if (is_literal(current_instruction().ingredients.at(i))) { trace(Primitive_recipe_depth, "run") << "$print: " << current_instruction().ingredients.at(i).name; - cout << current_instruction().ingredients.at(i).name; + if (has_property(current_instruction().ingredients.at(i), "newline")) + cout << '\n'; + else + cout << current_instruction().ingredients.at(i).name; } else { for (long long int j = 0; j < SIZE(ingredients.at(i)); ++j) { diff --git a/060string.mu b/060string.mu index 6cfbc318..74db7fe1 100644 --- a/060string.mu +++ b/060string.mu @@ -105,8 +105,7 @@ container buffer [ recipe new-buffer [ local-scope -#? $print default-space:address:array:location, [ -#? ] +#? $print default-space:address:array:location, 10:literal/newline result:address:buffer <- new buffer:type len:address:number <- get-address result:address:buffer/deref, length:offset len:address:number/deref <- copy 0:literal @@ -114,8 +113,7 @@ recipe new-buffer [ capacity:number, found?:boolean <- next-ingredient assert found?:boolean, [new-buffer must get a capacity argument] s:address:address:array:character/deref <- new character:type, capacity:number -#? $print s:address:address:array:character/deref, [ -#? ] +#? $print s:address:address:array:character/deref, 10:literal/newline reply result:address:buffer ] @@ -174,13 +172,10 @@ recipe buffer-append [ in:address:buffer <- grow-buffer in:address:buffer } s:address:array:character <- get in:address:buffer/deref, data:offset -#? $print [array underlying buf: ], s:address:array:character, [ -#? ] #? 1 -#? $print [index: ], len:address:number/deref, [ -#? ] #? 1 +#? $print [array underlying buf: ], s:address:array:character, 10:literal/newline +#? $print [index: ], len:address:number/deref, 10:literal/newline dest:address:character <- index-address s:address:array:character/deref, len:address:number/deref -#? $print [storing ], c:character, [ in ], dest:address:character, [ -#? ] #? 1 +#? $print [storing ], c:character, [ in ], dest:address:character, 10:literal/newline dest:address:character/deref <- copy c:character len:address:number/deref <- add len:address:number/deref, 1:literal reply in:address:buffer/same-as-ingredient:0 @@ -196,20 +191,6 @@ scenario buffer-append-works [ x:address:buffer <- buffer-append x:address:buffer, 99:literal # 'c' s2:address:array:character <- get x:address:buffer/deref, data:offset 1:boolean/raw <- equal s1:address:array:character, s2:address:array:character -#? $print s2:address:array:character, [ -#? ] -#? $print 1060:number/raw, [ -#? ] -#? $print 1061:number/raw, [ -#? ] -#? $print 1062:number/raw, [ -#? ] -#? $print 1063:number/raw, [ -#? ] -#? $print 1064:number/raw, [ -#? ] -#? $print 1065:number/raw, [ -#? ] 2:array:character/raw <- copy s2:address:array:character/deref +buffer-filled x:address:buffer <- buffer-append x:address:buffer, 100:literal # 'd' @@ -321,8 +302,7 @@ recipe buffer-to-array [ reply 0:literal } len:number <- get in:address:buffer/deref, length:offset -#? $print [size ], len:number, [ -#? ] #? 1 +#? $print [size ], len:number, 10:literal/newline s:address:array:character <- get in:address:buffer/deref, data:offset # we can't just return s because it is usually the wrong length result:address:array:character <- new character:type, len:number @@ -448,8 +428,7 @@ recipe interpolate [ result-len:number <- subtract result-len:number, 1:literal loop } -#? $print tem-len:number, [ ], $result-len:number, [ -#? ] #? 1 +#? $print tem-len:number, [ ], $result-len:number, 10:literal/newline rewind-ingredients _ <- next-ingredient # skip template # result = new array:character[result-len] diff --git a/061channel.mu b/061channel.mu index 9f86ba2d..2a839898 100644 --- a/061channel.mu +++ b/061channel.mu @@ -298,25 +298,22 @@ recipe buffer-lines [ break-unless backspace?:boolean # drop previous character #? close-console #? 2 -#? $print [backspace! #? 1 +#? $print [backspace! #? ] #? 1 { buffer-length:address:number <- get-address line:address:buffer/deref, length:offset buffer-empty?:boolean <- equal buffer-length:address:number/deref, 0:literal break-if buffer-empty?:boolean -#? $print [before: ], buffer-length:address:number/deref, [ -#? ] #? 1 +#? $print [before: ], buffer-length:address:number/deref, 10:literal/newline buffer-length:address:number/deref <- subtract buffer-length:address:number/deref, 1:literal -#? $print [after: ], buffer-length:address:number/deref, [ -#? ] #? 1 +#? $print [after: ], buffer-length:address:number/deref, 10:literal/newline } #? $exit #? 2 # and don't append this one loop +next-character:label } # append anything else -#? $print [buffer-lines: appending ], c:character, [ -#? ] +#? $print [buffer-lines: appending ], c:character, 10:literal/newline line:address:buffer <- buffer-append line:address:buffer, c:character line-done?:boolean <- equal c:character, 10:literal/newline break-if line-done?:boolean @@ -337,8 +334,7 @@ recipe buffer-lines [ break-if done?:boolean c:character <- index line-contents:address:array:character/deref, i:number out:address:channel <- write out:address:channel, c:character -#? $print [writing ], i:number, [: ], c:character, [ -#? ] #? 1 +#? $print [writing ], i:number, [: ], c:character, 10:literal/newline i:number <- add i:number, 1:literal loop } diff --git a/071print.mu b/071print.mu index 818c95f5..b970b02e 100644 --- a/071print.mu +++ b/071print.mu @@ -21,8 +21,7 @@ recipe new-fake-screen [ width:address:number/deref <- next-ingredient height:address:number <- get-address result:address:screen/deref, num-rows:offset height:address:number/deref <- next-ingredient -#? $print height:address:number/deref, [ -#? ] #? 1 +#? $print height:address:number/deref, 10:literal/newline row:address:number <- get-address result:address:screen/deref, cursor-row:offset row:address:number/deref <- copy 0:literal column:address:number <- get-address result:address:screen/deref, cursor-column:offset @@ -126,8 +125,7 @@ recipe print-character [ # special-case: newline { newline?:boolean <- equal c:character, 10:literal/newline -#? $print c:character, [ ], newline?:boolean, [ -#? ] #? 1 +#? $print c:character, [ ], newline?:boolean, 10:literal/newline break-unless newline?:boolean { # unless cursor is already at bottom @@ -164,8 +162,7 @@ recipe print-character [ } reply x:address:screen/same-as-ingredient:0 } -#? $print [saving character ], c:character, [ to fake screen ], cursor:address/screen, [ -#? ] #? 1 +#? $print [saving character ], c:character, [ to fake screen ], cursor:address/screen, 10:literal/newline cursor:address:screen-cell <- index-address buf:address:array:screen-cell/deref, index:number cursor-contents:address:character <- get-address cursor:address:screen-cell/deref, contents:offset cursor-color:address:number <- get-address cursor:address:screen-cell/deref, color:offset @@ -353,8 +350,7 @@ recipe clear-line [ # space over the entire line #? $start-tracing #? 1 { -#? $print column:address:number/deref, [ -#? ] #? 1 +#? $print column:address:number/deref, 10:literal/newline right:number <- subtract width:number, 1:literal done?:boolean <- greater-or-equal column:address:number/deref, right:number break-if done?:boolean @@ -448,11 +444,9 @@ recipe cursor-down [ at-bottom?:boolean <- greater-or-equal row:address:number/deref, max:number break-if at-bottom?:boolean # row = row+1 -#? $print [AAA: ], row:address:number, [ -> ], row:address:number/deref, [ -#? ] #? 1 +#? $print [AAA: ], row:address:number, [ -> ], row:address:number/deref, 10:literal/newline row:address:number/deref <- add row:address:number/deref, 1:literal -#? $print [BBB: ], row:address:number, [ -> ], row:address:number/deref, [ -#? ] #? 1 +#? $print [BBB: ], row:address:number, [ -> ], row:address:number/deref, 10:literal/newline #? $start-tracing #? 1 } reply x:address:screen/same-as-ingredient:0 diff --git a/chessboard.mu b/chessboard.mu index a91e6da7..638b8367 100644 --- a/chessboard.mu +++ b/chessboard.mu @@ -66,17 +66,6 @@ scenario print-board-and-read-move [ ] ] -#? scenario foo [ #? 1 -#? $print [aaa] #? 1 -#? run [ #? 1 -#? 1:number <- copy 34:literal #? 1 -#? ] #? 1 -#? memory-should-contain [ #? 1 -#? 1 <- 34 #? 1 -#? ] #? 1 -#? $print [zzz] #? 1 -#? ] #? 1 - ## Here's how 'chessboard' is implemented. recipe chessboard [ @@ -85,8 +74,7 @@ recipe chessboard [ local-scope screen:address <- next-ingredient console:address <- next-ingredient -#? $print [screen: ], screen:address, [, console: ], console:address, [ -#? ] #? 1 +#? $print [screen: ], screen:address, [, console: ], console:address, 10:literal/newline board:address:array:address:array:character <- initial-position # hook up stdin stdin:address:channel <- new-channel 10:literal/capacity @@ -98,31 +86,21 @@ recipe chessboard [ msg:address:array:character <- new [Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves. ] print-string screen:address, msg:address:array:character -#? $print [aaa -#? ] #? 1 cursor-to-next-line screen:address print-board screen:address, board:address:array:address:array:character cursor-to-next-line screen:address msg:address:array:character <- new [Type in your move as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>. ] print-string screen:address, msg:address:array:character -#? $print [bbb -#? ] #? 1 cursor-to-next-line screen:address msg:address:array:character <- new [Hit 'q' to exit. ] print-string screen:address, msg:address:array:character -#? $print [ccc -#? ] #? 1 { cursor-to-next-line screen:address msg:address:array:character <- new [move: ] print-string screen:address, msg:address:array:character -#? $print [ddd -#? ] #? 1 m:address:move, quit:boolean, error:boolean <- read-move buffered-stdin:address:channel, screen:address -#? $print [eee -#? ] #? 1 break-if quit:boolean, +quit:offset buffered-stdin:address:channel <- clear-channel buffered-stdin:address:channel # cleanup after error. todo: test this? loop-if error:boolean @@ -132,7 +110,6 @@ recipe chessboard [ loop } +quit -#? $print [aaa] #? 1 ] ## a board is an array of files, a file is an array of characters (squares) @@ -183,13 +160,11 @@ recipe print-board [ board:address:array:address:array:character <- next-ingredient row:number <- copy 7:literal # start printing from the top of the board # print each row -#? $print [printing board to screen ], screen:address, [ -#? ] #? 1 +#? $print [printing board to screen ], screen:address, 10:literal/newline { done?:boolean <- lesser-than row:number, 0:literal break-if done?:boolean -#? $print [printing rank ], row:number, [ -#? ] #? 1 +#? $print [printing rank ], row:number, 10:literal/newline # print rank number as a legend rank:number <- add row:number, 1:literal print-integer screen:address, rank:number @@ -349,8 +324,7 @@ recipe read-file [ reply 0:literal/dummy, 0:literal/quit, 1:literal/error } file:number <- subtract c:character, 97:literal # 'a' -#? $print file:number, [ -#? ] #? 1 +#? $print file:number, 10:literal/newline # 'a' <= file <= 'h' { above-min:boolean <- greater-or-equal file:number, 0:literal @@ -397,8 +371,7 @@ recipe read-rank [ reply 0:literal/dummy, 0:literal/quit, 1:literal/error } rank:number <- subtract c:character, 49:literal # '1' -#? $print rank:number, [ -#? ] #? 1 +#? $print rank:number, 10:literal/newline # assert'1' <= rank <= '8' { above-min:boolean <- greater-or-equal rank:number, 0:literal @@ -442,30 +415,25 @@ scenario read-move-blocking [ run [ #? $start-tracing #? 1 1:address:channel <- new-channel 2:literal -#? $print [aaa channel address: ], 1:address:channel, [ -#? ] #? 1 +#? $print [aaa channel address: ], 1:address:channel, 10:literal/newline 2:number/routine <- start-running read-move:recipe, 1:address:channel, screen:address # 'read-move' is waiting for input wait-for-routine 2:number -#? $print [bbb channel address: ], 1:address:channel, [ -#? ] #? 1 +#? $print [bbb channel address: ], 1:address:channel, 10:literal/newline 3:number <- routine-state 2:number/id -#? $print [I: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [I: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/waiting? <- equal 3:number/routine-state, 2:literal/waiting assert 4:boolean/waiting?, [ F read-move-blocking: routine failed to pause after coming up (before any keys were pressed)] # press 'a' -#? $print [ccc channel address: ], 1:address:channel, [ -#? ] #? 1 +#? $print [ccc channel address: ], 1:address:channel, 10:literal/newline #? $exit #? 1 1:address:channel <- write 1:address:channel, 97:literal # 'a' restart 2:number/routine # 'read-move' still waiting for input wait-for-routine 2:number 3:number <- routine-state 2:number/id -#? $print [II: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [II: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/waiting? <- equal 3:number/routine-state, 2:literal/waiting assert 4:boolean/waiting?, [ F read-move-blocking: routine failed to pause after rank 'a'] @@ -475,8 +443,7 @@ F read-move-blocking: routine failed to pause after rank 'a'] # 'read-move' still waiting for input wait-for-routine 2:number 3:number <- routine-state 2:number/id -#? $print [III: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [III: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/waiting? <- equal 3:number/routine-state, 2:literal/waiting assert 4:boolean/waiting?, [ F read-move-blocking: routine failed to pause after file 'a2'] @@ -486,8 +453,7 @@ F read-move-blocking: routine failed to pause after file 'a2'] # 'read-move' still waiting for input wait-for-routine 2:number 3:number <- routine-state 2:number -#? $print [IV: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [IV: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/waiting? <- equal 3:number/routine-state, 2:literal/waiting assert 4:boolean/waiting?/routine-state, [ F read-move-blocking: routine failed to pause after hyphen 'a2-'] @@ -497,8 +463,7 @@ F read-move-blocking: routine failed to pause after hyphen 'a2-'] # 'read-move' still waiting for input wait-for-routine 2:number 3:number <- routine-state 2:number -#? $print [V: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [V: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/waiting? <- equal 3:number/routine-state, 2:literal/waiting assert 4:boolean/waiting?/routine-state, [ F read-move-blocking: routine failed to pause after rank 'a2-a'] @@ -508,8 +473,7 @@ F read-move-blocking: routine failed to pause after rank 'a2-a'] # 'read-move' still waiting for input wait-for-routine 2:number 3:number <- routine-state 2:number -#? $print [VI: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [VI: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/waiting? <- equal 3:number/routine-state, 2:literal/waiting assert 4:boolean/waiting?, [ F read-move-blocking: routine failed to pause after file 'a2-a4'] @@ -519,8 +483,7 @@ F read-move-blocking: routine failed to pause after file 'a2-a4'] # 'read-move' now completes wait-for-routine 2:number 3:number <- routine-state 2:number -#? $print [VII: routine ], 2:number, [ state ], 3:number [ -#? ] #? 1 +#? $print [VII: routine ], 2:number, [ state ], 3:number 10:literal/newline 4:boolean/completed? <- equal 3:number/routine-state, 1:literal/completed assert 4:boolean/completed?, [ F read-move-blocking: routine failed to terminate on newline] @@ -628,23 +591,18 @@ recipe make-move [ b:address:array:address:array:character <- next-ingredient m:address:move <- next-ingredient from-file:number <- get m:address:move/deref, from-file:offset -#? $print from-file:number, [ -#? ] #? 1 +#? $print from-file:number, 10:literal/newline from-rank:number <- get m:address:move/deref, from-rank:offset -#? $print from-rank:number, [ -#? ] #? 1 +#? $print from-rank:number, 10:literal/newline to-file:number <- get m:address:move/deref, to-file:offset -#? $print to-file:number, [ -#? ] #? 1 +#? $print to-file:number, 10:literal/newline to-rank:number <- get m:address:move/deref, to-rank:offset -#? $print to-rank:number, [ -#? ] #? 1 +#? $print to-rank:number, 10:literal/newline f:address:array:character <- index b:address:array:address:array:character/deref, from-file:number src:address:character/square <- index-address f:address:array:character/deref, from-rank:number f:address:array:character <- index b:address:array:address:array:character/deref, to-file:number dest:address:character/square <- index-address f:address:array:character/deref, to-rank:number -#? $print src:address:character/deref, [ -#? ] #? 1 +#? $print src:address:character/deref, 10:literal/newline dest:address:character/deref/square <- copy src:address:character/deref/square src:address:character/deref/square <- copy 32:literal # ' ' reply b:address:array:address:array:character/same-as-ingredient:0 diff --git a/edit.mu b/edit.mu index 7a1fa232..2e3276ae 100644 --- a/edit.mu +++ b/edit.mu @@ -878,8 +878,7 @@ recipe insert-at-cursor [ editor:address:editor-data <- next-ingredient c:character <- next-ingredient screen:address <- next-ingredient -#? $print [insert ], c:character, [ -#? ] #? 1 +#? $print [insert ], c:character, 10:literal/newline before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset d:address:duplex-list <- get editor:address:editor-data/deref, data:offset insert-duplex c:character, before-cursor:address:address:duplex-list/deref @@ -901,8 +900,7 @@ recipe insert-at-cursor [ { # if we're at the column just before the wrap indicator wrap-column:number <- subtract right:number, 1:literal -#? $print [wrap? ], cursor-column:address:number/deref, [ vs ], wrap-column:number, [ -#? ] #? 1 +#? $print [wrap? ], cursor-column:address:number/deref, [ vs ], wrap-column:number, 10:literal/newline at-wrap?:boolean <- greater-or-equal cursor-column:address:number/deref, wrap-column:number break-unless at-wrap?:boolean #? $print [wrap! @@ -936,8 +934,7 @@ recipe delete-before-cursor [ before-cursor:address:address:duplex-list/deref <- copy prev:address:duplex-list cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset cursor-column:address:number/deref <- subtract cursor-column:address:number/deref, 1:literal -#? $print [delete-before-cursor: ], cursor-column:address:number/deref, [ -#? ] #? 1 +#? $print [delete-before-cursor: ], cursor-column:address:number/deref, 10:literal/newline ] # takes a pointer 'curr' into the doubly-linked list and its sentinel, counts @@ -1170,8 +1167,7 @@ recipe render-sandboxes [ screen-height:number <- screen-height screen:address at-bottom?:boolean <- greater-or-equal row:number screen-height:number reply-if at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 -#? $print [rendering sandbox ], sandbox:address:sandbox-data, [ -#? ] #? 1 +#? $print [rendering sandbox ], sandbox:address:sandbox-data, 10:literal/newline # render sandbox menu row:number <- add row:number, 1:literal move-cursor screen:address, row:number, left:number @@ -2736,8 +2732,7 @@ recipe run-sandboxes [ warnings:address:address:array:character <- get-address curr:address:sandbox-data/deref, warnings:offset fake-screen:address:address:screen <- get-address curr:address:sandbox-data/deref, screen:offset response:address:address:array:character/deref, warnings:address:address:array:character/deref, fake-screen:address:address:screen/deref <- run-interactive data:address:address:array:character/deref -#? $print warnings:address:address:array:character/deref, [ ], warnings:address:address:array:character/deref/deref, [ -#? ] #? 1 +#? $print warnings:address:address:array:character/deref, [ ], warnings:address:address:array:character/deref/deref, 10:literal/newline curr:address:sandbox-data <- get curr:address:sandbox-data/deref, next-sandbox:offset loop } @@ -2751,16 +2746,14 @@ recipe delete-sandbox [ click-column:number <- get t:touch-event, column:offset current-sandbox:address:editor-data <- get env:address:programming-environment-data/deref, current-sandbox:offset right:number <- get current-sandbox:address:editor-data/deref, right:offset -#? $print [comparing column ], click-column:number, [ vs ], right:number, [ -#? ] #? 1 +#? $print [comparing column ], click-column:number, [ vs ], right:number, 10:literal/newline at-right?:boolean <- equal click-column:number, right:number reply-unless at-right?:boolean, 0:literal/false #? $print [trying to delete #? ] #? 1 click-row:number <- get t:touch-event, row:offset prev:address:address:sandbox-data <- get-address env:address:programming-environment-data/deref, sandbox:offset -#? $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, [ -#? ] #? 1 +#? $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, 10:literal/newline curr:address:sandbox-data <- get env:address:programming-environment-data/deref, sandbox:offset { #? $print [next sandbox @@ -2771,21 +2764,18 @@ recipe delete-sandbox [ #? $print [checking #? ] #? 1 target-row:number <- get curr:address:sandbox-data/deref, starting-row-on-screen:offset -#? $print [comparing row ], target-row:number, [ vs ], click-row:number, [ -#? ] #? 1 +#? $print [comparing row ], target-row:number, [ vs ], click-row:number, 10:literal/newline delete-curr?:boolean <- equal target-row:number, click-row:number break-unless delete-curr?:boolean #? $print [found! #? ] #? 1 # delete this sandbox, rerender and stop prev:address:address:sandbox-data/deref <- get curr:address:sandbox-data/deref, next-sandbox:offset -#? $print [setting prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, [ -#? ] #? 1 +#? $print [setting prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, 10:literal/newline reply 1:literal/true } prev:address:address:sandbox-data <- get-address curr:address:sandbox-data/deref, next-sandbox:offset -#? $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, [ -#? ] #? 1 +#? $print [prev: ], prev:address:address:sandbox-data, [ -> ], prev:address:address:sandbox-data/deref, 10:literal/newline curr:address:sandbox-data <- get curr:address:sandbox-data/deref, next-sandbox:offset loop } @@ -3229,8 +3219,7 @@ recipe print-string-with-gradient-background [ color-range:number <- subtract bg-color2:number, bg-color1:number color-quantum:number <- divide color-range:number, len:number #? close-console #? 2 -#? $print len:number, [, ], color-range:number, [, ], color-quantum:number, [ -#? ] #? 2 +#? $print len:number, [, ], color-range:number, [, ], color-quantum:number, 10:literal/newline #? #? $exit #? 3 bg-color:number <- copy bg-color1:number i:number <- copy 0:literal @@ -3241,8 +3230,7 @@ recipe print-string-with-gradient-background [ print-character x:address:screen, c:character, color:number, bg-color:number i:number <- add i:number, 1:literal bg-color:number <- add bg-color:number, color-quantum:number -#? $print [=> ], bg-color:number, [ -#? ] #? 1 +#? $print [=> ], bg-color:number, 10:literal/newline loop } #? $exit #? 1 |