diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-04-24 11:54:30 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-04-24 11:54:30 -0700 |
commit | b0bf5321de2ba32f3b92c2faf6b7b68a06b6b432 (patch) | |
tree | 9e0473bddd0d9a2d4aec7ac58dec8d85c2833a5d /chessboard.mu | |
parent | 15936c91a9f8023dc868a021029f84b45aa50176 (diff) | |
download | mu-b0bf5321de2ba32f3b92c2faf6b7b68a06b6b432.tar.gz |
2864 - replace all address:shared with just address
Now that we no longer have non-shared addresses, we can just always track refcounts for all addresses. Phew!
Diffstat (limited to 'chessboard.mu')
-rw-r--r-- | chessboard.mu | 102 |
1 files changed, 51 insertions, 51 deletions
diff --git a/chessboard.mu b/chessboard.mu index 91e2e3fd..0e13afce 100644 --- a/chessboard.mu +++ b/chessboard.mu @@ -33,7 +33,7 @@ scenario print-board-and-read-move [ ] ] run [ - screen:address:shared:screen, console:address:shared:console <- chessboard screen:address:shared:screen, console:address:shared:console + screen:address:screen, console:address:console <- chessboard screen:address:screen, console:address:console # icon for the cursor screen <- print screen, 9251/␣ ] @@ -65,15 +65,15 @@ scenario print-board-and-read-move [ ## Here's how 'chessboard' is implemented. -def chessboard screen:address:shared:screen, console:address:shared:console -> screen:address:shared:screen, console:address:shared:console [ +def chessboard screen:address:screen, console:address:console -> screen:address:screen, console:address:console [ local-scope load-ingredients - board:address:shared:array:address:shared:array:character <- initial-position + board:address:array:address:array:character <- initial-position # hook up stdin - stdin-in:address:shared:source:character, stdin-out:address:shared:sink:character <- new-channel 10/capacity + stdin-in:address:source:character, stdin-out:address:sink:character <- new-channel 10/capacity start-running send-keys-to-channel, console, stdin-out, screen # buffer lines in stdin - buffered-stdin-in:address:shared:source:character, buffered-stdin-out:address:shared:sink:character <- new-channel 10/capacity + buffered-stdin-in:address:source:character, buffered-stdin-out:address:sink:character <- new-channel 10/capacity start-running buffer-lines, stdin-in, buffered-stdin-out { print screen, [Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves. @@ -89,7 +89,7 @@ def chessboard screen:address:shared:screen, console:address:shared:console -> s { cursor-to-next-line screen screen <- print screen, [move: ] - m:address:shared:move, quit:boolean, error:boolean <- read-move buffered-stdin-in, screen + m:address:move, quit:boolean, error:boolean <- read-move buffered-stdin-in, screen break-if quit, +quit:label buffered-stdin-in <- clear buffered-stdin-in # cleanup after error. todo: test this? loop-if error @@ -103,7 +103,7 @@ def chessboard screen:address:shared:screen, console:address:shared:console -> s ## a board is an array of files, a file is an array of characters (squares) -def new-board initial-position:address:shared:array:character -> board:address:shared:array:address:shared:array:character [ +def new-board initial-position:address:array:character -> board:address:array:address:array:character [ local-scope load-ingredients # assert(length(initial-position) == 64) @@ -111,19 +111,19 @@ def new-board initial-position:address:shared:array:character -> board:address:s correct-length?:boolean <- equal len, 64 assert correct-length?, [chessboard had incorrect size] # board is an array of pointers to files; file is an array of characters - board <- new {(address shared array character): type}, 8 + board <- new {(address array character): type}, 8 col:number <- copy 0 { done?:boolean <- equal col, 8 break-if done? - file:address:shared:array:character <- new-file initial-position, col + file:address:array:character <- new-file initial-position, col *board <- put-index *board, col, file col <- add col, 1 loop } ] -def new-file position:address:shared:array:character, index:number -> result:address:shared:array:character [ +def new-file position:address:array:character, index:number -> result:address:array:character [ local-scope load-ingredients index <- multiply index, 8 @@ -140,7 +140,7 @@ def new-file position:address:shared:array:character, index:number -> result:add } ] -def print-board screen:address:shared:screen, board:address:shared:array:address:shared:array:character -> screen:address:shared:screen [ +def print-board screen:address:screen, board:address:array:address:array:character -> screen:address:screen [ local-scope load-ingredients row:number <- copy 7 # start printing from the top of the board @@ -158,7 +158,7 @@ def print-board screen:address:shared:screen, board:address:shared:array:address { done?:boolean <- equal col:number, 8 break-if done?:boolean - f:address:shared:array:character <- index *board, col + f:address:array:character <- index *board, col c:character <- index *f, row print screen, c print screen, space @@ -176,7 +176,7 @@ def print-board screen:address:shared:screen, board:address:shared:array:address cursor-to-next-line screen ] -def initial-position -> board:address:shared:array:address:shared:array:character [ +def initial-position -> board:address:array:address:array:character [ local-scope # layout in memory (in raster order): # R P _ _ _ _ p r @@ -187,7 +187,7 @@ def initial-position -> board:address:shared:array:address:shared:array:characte # B P _ _ _ _ p B # N P _ _ _ _ p n # R P _ _ _ _ p r - initial-position:address:shared:array:character <- new-array 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r, 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n, 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, 81/Q, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 113/q, 75/K, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 107/k, 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n, 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r + initial-position:address:array:character <- new-array 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r, 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n, 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, 81/Q, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 113/q, 75/K, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 107/k, 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n, 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r #? 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r, #? 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n, #? 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, @@ -202,8 +202,8 @@ def initial-position -> board:address:shared:array:address:shared:array:characte scenario printing-the-board [ assume-screen 30/width, 12/height run [ - 1:address:shared:array:address:shared:array:character/board <- initial-position - screen:address:shared:screen <- print-board screen:address:shared:screen, 1:address:shared:array:address:shared:array:character/board + 1:address:array:address:array:character/board <- initial-position + screen:address:screen <- print-board screen:address:screen, 1:address:array:address:array:character/board ] screen-should-contain [ # 012345678901234567890123456789 @@ -233,14 +233,14 @@ container move [ ] # prints only error messages to screen -def read-move stdin:address:shared:source:character, screen:address:shared:screen -> result:address:shared:move, quit?:boolean, error?:boolean, stdin:address:shared:source:character, screen:address:shared:screen [ +def read-move stdin:address:source:character, screen:address:screen -> result:address:move, quit?:boolean, error?:boolean, stdin:address:source:character, screen:address:screen [ local-scope load-ingredients from-file:number, quit?:boolean, error?:boolean <- read-file stdin, screen return-if quit?, 0/dummy return-if error?, 0/dummy # construct the move object - result:address:shared:move <- new move:type + result:address:move <- new move:type *result <- put *result, from-file:offset, from-file from-rank:number, quit?, error? <- read-rank stdin, screen return-if quit?, 0/dummy @@ -261,7 +261,7 @@ def read-move stdin:address:shared:source:character, screen:address:shared:scree ] # valid values for file: 0-7 -def read-file stdin:address:shared:source:character, screen:address:shared:screen -> file:number, quit:boolean, error:boolean, stdin:address:shared:source:character, screen:address:shared:screen [ +def read-file stdin:address:source:character, screen:address:screen -> file:number, quit:boolean, error:boolean, stdin:address:source:character, screen:address:screen [ local-scope load-ingredients c:character, stdin <- read stdin @@ -307,7 +307,7 @@ def read-file stdin:address:shared:source:character, screen:address:shared:scree ] # valid values: 0-7, -1 (quit), -2 (error) -def read-rank stdin:address:shared:source:character, screen:address:shared:screen -> rank:number, quit?:boolean, error?:boolean, stdin:address:shared:source:character, screen:address:shared:screen [ +def read-rank stdin:address:source:character, screen:address:screen -> rank:number, quit?:boolean, error?:boolean, stdin:address:source:character, screen:address:screen [ local-scope load-ingredients c:character, stdin <- read stdin @@ -348,7 +348,7 @@ def read-rank stdin:address:shared:source:character, screen:address:shared:scree # read a character from the given channel and check that it's what we expect # return true on error -def expect-from-channel stdin:address:shared:source:character, expected:character, screen:address:shared:screen -> result:boolean, stdin:address:shared:source:character, screen:address:shared:screen [ +def expect-from-channel stdin:address:source:character, expected:character, screen:address:screen -> result:boolean, stdin:address:source:character, screen:address:screen [ local-scope load-ingredients c:character, stdin <- read stdin @@ -363,8 +363,8 @@ def expect-from-channel stdin:address:shared:source:character, expected:characte scenario read-move-blocking [ assume-screen 20/width, 2/height run [ - 1:address:shared:source:character, 2:address:shared:sink:character <- new-channel 2/capacity - 3:number/routine <- start-running read-move, 1:address:shared:source:character, screen:address:shared:screen + 1:address:source:character, 2:address:sink:character <- new-channel 2/capacity + 3:number/routine <- start-running read-move, 1:address:source:character, screen:address:screen # 'read-move' is waiting for input wait-for-routine 3:number 4:number <- routine-state 3:number/id @@ -372,7 +372,7 @@ scenario read-move-blocking [ assert 5:boolean/waiting?, [ F read-move-blocking: routine failed to pause after coming up (before any keys were pressed)] # press 'a' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 97/a + 2:address:sink:character <- write 2:address:sink:character, 97/a restart 3:number/routine # 'read-move' still waiting for input wait-for-routine 3:number @@ -381,7 +381,7 @@ F read-move-blocking: routine failed to pause after coming up (before any keys w assert 5:boolean/waiting?, [ F read-move-blocking: routine failed to pause after rank 'a'] # press '2' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 50/'2' + 2:address:sink:character <- write 2:address:sink:character, 50/'2' restart 3:number/routine # 'read-move' still waiting for input wait-for-routine 3:number @@ -390,7 +390,7 @@ F read-move-blocking: routine failed to pause after rank 'a'] assert 5:boolean/waiting?, [ F read-move-blocking: routine failed to pause after file 'a2'] # press '-' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 45/'-' + 2:address:sink:character <- write 2:address:sink:character, 45/'-' restart 3:number/routine # 'read-move' still waiting for input wait-for-routine 3:number @@ -399,7 +399,7 @@ F read-move-blocking: routine failed to pause after file 'a2'] assert 5:boolean/waiting?/routine-state, [ F read-move-blocking: routine failed to pause after hyphen 'a2-'] # press 'a' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 97/a + 2:address:sink:character <- write 2:address:sink:character, 97/a restart 3:number/routine # 'read-move' still waiting for input wait-for-routine 3:number @@ -408,7 +408,7 @@ F read-move-blocking: routine failed to pause after hyphen 'a2-'] assert 5:boolean/waiting?/routine-state, [ F read-move-blocking: routine failed to pause after rank 'a2-a'] # press '4' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 52/'4' + 2:address:sink:character <- write 2:address:sink:character, 52/'4' restart 3:number/routine # 'read-move' still waiting for input wait-for-routine 3:number @@ -417,7 +417,7 @@ F read-move-blocking: routine failed to pause after rank 'a2-a'] assert 5:boolean/waiting?, [ F read-move-blocking: routine failed to pause after file 'a2-a4'] # press 'newline' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 10 # newline + 2:address:sink:character <- write 2:address:sink:character, 10 # newline restart 3:number/routine # 'read-move' now completes wait-for-routine 3:number @@ -435,8 +435,8 @@ F read-move-blocking: routine failed to terminate on newline] scenario read-move-quit [ assume-screen 20/width, 2/height run [ - 1:address:shared:source:character, 2:address:shared:sink:character <- new-channel 2/capacity - 3:number/routine <- start-running read-move, 1:address:shared:channel:character, screen:address:shared:screen + 1:address:source:character, 2:address:sink:character <- new-channel 2/capacity + 3:number/routine <- start-running read-move, 1:address:channel:character, screen:address:screen # 'read-move' is waiting for input wait-for-routine 3:number 4:number <- routine-state 3:number/id @@ -444,7 +444,7 @@ scenario read-move-quit [ assert 5:boolean/waiting?, [ F read-move-quit: routine failed to pause after coming up (before any keys were pressed)] # press 'q' - 2:address:shared:sink:character <- write 2:address:shared:sink:character, 113/q + 2:address:sink:character <- write 2:address:sink:character, 113/q restart 3:number/routine # 'read-move' completes wait-for-routine 3:number @@ -462,15 +462,15 @@ F read-move-quit: routine failed to terminate on 'q'] scenario read-move-illegal-file [ assume-screen 20/width, 2/height run [ - 1:address:shared:source:character, 2:address:shared:sink:character <- new-channel 2/capacity - 3:number/routine <- start-running read-move, 1:address:shared:source:character, screen:address:shared:screen + 1:address:source:character, 2:address:sink:character <- new-channel 2/capacity + 3:number/routine <- start-running read-move, 1:address:source:character, screen:address:screen # 'read-move' is waiting for input wait-for-routine 3:number 4:number <- routine-state 3:number/id 5:boolean/waiting? <- equal 4:number/routine-state, 3/waiting assert 5:boolean/waiting?, [ F read-move-file: routine failed to pause after coming up (before any keys were pressed)] - 1:address:shared:sink:character <- write 1:address:shared:sink:character, 50/'2' + 1:address:sink:character <- write 1:address:sink:character, 50/'2' restart 3:number/routine wait-for-routine 3:number ] @@ -483,16 +483,16 @@ F read-move-file: routine failed to pause after coming up (before any keys were scenario read-move-illegal-rank [ assume-screen 20/width, 2/height run [ - 1:address:shared:source:character, 2:address:shared:sink:character <- new-channel 2/capacity - 3:number/routine <- start-running read-move, 1:address:shared:source:character, screen:address:shared:screen + 1:address:source:character, 2:address:sink:character <- new-channel 2/capacity + 3:number/routine <- start-running read-move, 1:address:source:character, screen:address:screen # 'read-move' is waiting for input wait-for-routine 3:number 4:number <- routine-state 3:number/id 5:boolean/waiting? <- equal 4:number/routine-state, 3/waiting assert 5:boolean/waiting?, [ F read-move-file: routine failed to pause after coming up (before any keys were pressed)] - 1:address:shared:sink:character <- write 1:address:shared:sink:character, 97/a - 1:address:shared:sink:character <- write 1:address:shared:sink:character, 97/a + 1:address:sink:character <- write 1:address:sink:character, 97/a + 1:address:sink:character <- write 1:address:sink:character, 97/a restart 3:number/routine wait-for-routine 3:number ] @@ -505,16 +505,16 @@ F read-move-file: routine failed to pause after coming up (before any keys were scenario read-move-empty [ assume-screen 20/width, 2/height run [ - 1:address:shared:source:character, 2:address:shared:sink:character <- new-channel 2/capacity - 3:number/routine <- start-running read-move, 1:address:shared:source:character, screen:address:shared:screen + 1:address:source:character, 2:address:sink:character <- new-channel 2/capacity + 3:number/routine <- start-running read-move, 1:address:source:character, screen:address:screen # 'read-move' is waiting for input wait-for-routine 3:number 4:number <- routine-state 3:number/id 5:boolean/waiting? <- equal 4:number/routine-state, 3/waiting assert 5:boolean/waiting?, [ F read-move-file: routine failed to pause after coming up (before any keys were pressed)] - 1:address:shared:sink:character <- write 1:address:shared:sink:character, 10/newline - 1:address:shared:sink:character <- write 1:address:shared:sink:character, 97/a + 1:address:sink:character <- write 1:address:sink:character, 10/newline + 1:address:sink:character <- write 1:address:sink:character, 97/a restart 3:number/routine wait-for-routine 3:number ] @@ -524,15 +524,15 @@ F read-move-file: routine failed to pause after coming up (before any keys were ] ] -def make-move board:address:shared:array:address:shared:array:character, m:address:shared:move -> board:address:shared:array:address:shared:array:character [ +def make-move board:address:array:address:array:character, m:address:move -> board:address:array:address:array:character [ local-scope load-ingredients from-file:number <- get *m, from-file:offset from-rank:number <- get *m, from-rank:offset to-file:number <- get *m, to-file:offset to-rank:number <- get *m, to-rank:offset - from-f:address:shared:array:character <- index *board, from-file - to-f:address:shared:array:character <- index *board, to-file + from-f:address:array:character <- index *board, from-file + to-f:address:array:character <- index *board, to-file src:character/square <- index *from-f, from-rank *to-f <- put-index *to-f, to-rank, src *from-f <- put-index *from-f, from-rank, 32/space @@ -541,11 +541,11 @@ def make-move board:address:shared:array:address:shared:array:character, m:addre scenario making-a-move [ assume-screen 30/width, 12/height run [ - 2:address:shared:array:address:shared:array:character/board <- initial-position - 3:address:shared:move <- new move:type - *3:address:shared:move <- merge 6/g, 1/'2', 6/g, 3/'4' - 2:address:shared:array:address:shared:array:character/board <- make-move 2:address:shared:array:address:shared:array:character/board, 3:address:shared:move - screen:address:shared:screen <- print-board screen:address:shared:screen, 2:address:shared:array:address:shared:array:character/board + 2:address:array:address:array:character/board <- initial-position + 3:address:move <- new move:type + *3:address:move <- merge 6/g, 1/'2', 6/g, 3/'4' + 2:address:array:address:array:character/board <- make-move 2:address:array:address:array:character/board, 3:address:move + screen:address:screen <- print-board screen:address:screen, 2:address:array:address:array:character/board ] screen-should-contain [ # 012345678901234567890123456789 |