diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-01-01 11:11:02 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-01-01 11:20:54 -0800 |
commit | ce3518f362743d7a004f952358864748eecf8c0d (patch) | |
tree | cd9677d5d2653d34eeb3094796a50523bf94b66d | |
parent | a03b8aea543689d1fdb8c7b70ffdec9678833db6 (diff) | |
download | mu-ce3518f362743d7a004f952358864748eecf8c0d.tar.gz |
478 - snapshot while debugging chessboard
This took a couple of hours to track down. I had to shrink down to a 2x2 chessboard, isolate a half-move (just a square to clear) that triggered an error, then hard-code the half-move to make it non-interactive, then copy my changes over to the non-cursor version in chessboard.mu, then start debugging trace. And then I found I was using an 'index-address' rather than 'index' to go from a board to a file-address inside 'make-move'. And that was corrupting the array of file pointers. Things I wish I had to help me here: a) a type checker. b) more speed. Are lists slowing down super-linearly? need an arc profiler. c) a side channel for traces even when the program is in cursor mode. I do have that (hence the 'new-trace' before calling main), but for some reason it wasn't convenient. Just had to buckle down, I think. d) the right '#ifdef's to switch between hard-coded move and interactive move, text vs cursor mode, etc. e) just in general better curation of traces to easily see what's going on. But that's just a pipe dream.
-rw-r--r-- | chessboard-rawterm.mu | 123 | ||||
-rw-r--r-- | chessboard.mu | 145 | ||||
-rw-r--r-- | mu.arc | 22 |
3 files changed, 226 insertions, 64 deletions
diff --git a/chessboard-rawterm.mu b/chessboard-rawterm.mu index 0dbf6245..1e969d69 100644 --- a/chessboard-rawterm.mu +++ b/chessboard-rawterm.mu @@ -1,5 +1,6 @@ (function read-board [ (default-scope:scope-address <- new scope:literal 30:literal) +;? (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal) (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal @@ -12,12 +13,15 @@ ;? (print-primitive (("list-length\n" literal))) (len:integer <- list-length initial-position:list-address) (correct-length?:boolean <- equal len:integer 64:literal) - (assert correct-length?:boolean "chessboard had incorrect size") +;? (correct-length?:boolean <- equal len:integer 4:literal) + (assert correct-length?:boolean (("chessboard had incorrect size" literal))) (b:board-address <- new board:literal 8:literal) +;? (b:board-address <- new board:literal 2:literal) (col:integer <- copy 0:literal) (curr:list-address <- copy initial-position:list-address) { begin (done?:boolean <- equal col:integer 8:literal) +;? (done?:boolean <- equal col:integer 2:literal) (break-if done?:boolean) ;? (print-primitive col:integer) ;? (print-primitive (("\n" literal))) @@ -33,9 +37,11 @@ (default-scope:scope-address <- new scope:literal 30:literal) (cursor:list-address <- next-input) (result:file-address <- new file:literal 8:literal) +;? (result:file-address <- new file:literal 2:literal) (row:integer <- copy 0:literal) { begin (done?:boolean <- equal row:integer 8:literal) +;? (done?:boolean <- equal row:integer 2:literal) (break-if done?:boolean) ;? (print-primitive ((" " literal))) ;? (print-primitive row:integer) @@ -54,6 +60,7 @@ (default-scope:scope-address <- new scope:literal 30:literal) (b:board-address <- next-input) (row:integer <- copy 7:literal) +;? (row:integer <- copy 1:literal) (screen-y:integer <- copy 1:literal) ; print each row { begin @@ -64,6 +71,7 @@ (col:integer <- copy 0:literal) { begin (done?:boolean <- equal col:integer 8:literal) +;? (done?:boolean <- equal col:integer 2:literal) (break-if done?:boolean) (f:file-address <- index b:board-address/deref col:integer) (s:square <- index f:file-address/deref row:integer) @@ -88,55 +96,57 @@ (function read-move [ (a:character <- copy ((#\a literal))) (file-base:integer <- character-to-integer a:character) - (file-base:integer <- subtract file-base:integer 1:literal) +;? (file-base:integer <- subtract file-base:integer 1:literal) (one:character <- copy ((#\1 literal))) (rank-base:integer <- character-to-integer one:character) - (rank-base:integer <- subtract rank-base:integer 1:literal) +;? (rank-base:integer <- subtract rank-base:integer 1:literal) ; get from-file - (c:character <- wait-for-key) + (c:character <- copy ((#\a literal))) ;wait-for-key) (print-primitive c:character) (from-file:integer <- character-to-integer c:character) (from-file:integer <- subtract from-file:integer file-base:integer) ; assert('a' <= from-file <= 'h') - (above-min:boolean <- greater-or-equal from-file:integer 1:literal) + (above-min:boolean <- greater-or-equal from-file:integer 0:literal) (assert above-min:boolean (("from-file too low" literal))) - (below-max:boolean <- lesser-or-equal from-file:integer 8:literal) + (below-max:boolean <- lesser-or-equal from-file:integer 7:literal) +;? (below-max:boolean <- lesser-or-equal from-file:integer 1:literal) (assert below-max:boolean (("from-file too high" literal))) ; get from-rank - (c:character <- wait-for-key) + (c:character <- copy ((#\1 literal))) ;wait-for-key) (print-primitive c:character) (from-rank:integer <- character-to-integer c:character) (from-rank:integer <- subtract from-rank:integer rank-base:integer) - ; assert(1 <= from-rank <= 8) - (above-min:boolean <- greater-or-equal from-rank:integer 1:literal) + ; assert(0 <= from-rank <= 7) + (above-min:boolean <- greater-or-equal from-rank:integer 0:literal) (assert above-min:boolean (("from-rank too low" literal))) - (below-max:boolean <- lesser-or-equal from-rank:integer 8:literal) + (below-max:boolean <- lesser-or-equal from-rank:integer 7:literal) +;? (below-max:boolean <- lesser-or-equal from-rank:integer 1:literal) (assert below-max:boolean (("from-rank too high" literal))) - ; slurp hyphen - (c:character <- wait-for-key) - (print-primitive c:character) - (hyphen?:boolean <- equal c:character ((#\- literal))) - (assert hyphen?:boolean (("expected hyphen" literal))) - ; get to-file - (c:character <- wait-for-key) - (print-primitive c:character) - (to-file:integer <- character-to-integer c:character) - (to-file:integer <- subtract to-file:integer file-base:integer) - ; assert('a' <= to-file <= 'h') - (above-min:boolean <- greater-or-equal to-file:integer 1:literal) - (assert above-min:boolean (("to-file too low" literal))) - (below-max:boolean <- lesser-or-equal to-file:integer 8:literal) - (assert below-max:boolean (("to-file too high" literal))) - ; get to-rank - (c:character <- wait-for-key) - (print-primitive c:character) - (to-rank:integer <- character-to-integer c:character) - (to-rank:integer <- subtract to-rank:integer rank-base:integer) - ; assert(1 <= to-rank <= 8) - (above-min:boolean <- greater-or-equal to-rank:integer 1:literal) - (assert above-min:boolean (("to-rank too low" literal))) - (below-max:boolean <- lesser-or-equal to-rank:integer 8:literal) - (assert below-max:boolean (("to-rank too high" literal))) +;? ; slurp hyphen +;? (c:character <- wait-for-key) +;? (print-primitive c:character) +;? (hyphen?:boolean <- equal c:character ((#\- literal))) +;? (assert hyphen?:boolean (("expected hyphen" literal))) +;? ; get to-file +;? (c:character <- wait-for-key) +;? (print-primitive c:character) +;? (to-file:integer <- character-to-integer c:character) +;? (to-file:integer <- subtract to-file:integer file-base:integer) +;? ; assert('a' <= to-file <= 'h') +;? (above-min:boolean <- greater-or-equal to-file:integer 1:literal) +;? (assert above-min:boolean (("to-file too low" literal))) +;? (below-max:boolean <- lesser-or-equal to-file:integer 2:literal) +;? (assert below-max:boolean (("to-file too high" literal))) +;? ; get to-rank +;? (c:character <- wait-for-key) +;? (print-primitive c:character) +;? (to-rank:integer <- character-to-integer c:character) +;? (to-rank:integer <- subtract to-rank:integer rank-base:integer) +;? ; assert(1 <= to-rank <= 2) +;? (above-min:boolean <- greater-or-equal to-rank:integer 1:literal) +;? (assert above-min:boolean (("to-rank too low" literal))) +;? (below-max:boolean <- lesser-or-equal to-rank:integer 2:literal) +;? (assert below-max:boolean (("to-rank too high" literal))) ; construct the move object (result:move-address <- new move:literal) (f:integer-integer-pair-address <- get-address result:move-address/deref from:offset) @@ -144,14 +154,42 @@ (dest:integer-address/deref <- copy from-file:integer) (dest:integer-address <- get-address f:integer-integer-pair-address/deref 1:offset) (dest:integer-address/deref <- copy from-rank:integer) - (t0:integer-integer-pair-address <- get-address result:move-address/deref to:offset) - (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 0:offset) - (dest:integer-address/deref <- copy to-file:integer) - (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 1:offset) - (dest:integer-address/deref <- copy to-rank:integer) +;? (t0:integer-integer-pair-address <- get-address result:move-address/deref to:offset) +;? (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 0:offset) +;? (dest:integer-address/deref <- copy to-file:integer) +;? (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 1:offset) +;? (dest:integer-address/deref <- copy to-rank:integer) (reply result:move-address) ]) +(function make-move [ + (default-scope:scope-address <- new scope:literal 30:literal) + (b:board-address <- next-input) + (m:move-address <- next-input) + (x:integer-integer-pair <- get m:move-address/deref from:offset) + (from-file:integer <- get x:integer-integer-pair 0:offset) +;? (print-primitive (("\n" literal))) +;? (print-primitive from-file:integer) +;? (print-primitive (("\n" literal))) + (from-rank:integer <- get x:integer-integer-pair 1:offset) +;? (print-primitive from-rank:integer) +;? (print-primitive (("\n" literal))) + (f:file-address <- index b:board-address/deref from-file:integer) + (src:square-address <- index-address f:file-address/deref from-rank:integer) +;? (x:integer-integer-pair <- get m:move-address/deref to:offset) +;? (to-file:integer <- get x:integer-integer-pair 0:offset) +;? ;? (print-primitive to-file:integer) +;? ;? (print-primitive (("\n" literal))) +;? (to-rank:integer <- get x:integer-integer-pair 1:offset) +;? ;? (print-primitive to-rank:integer) +;? ;? (print-primitive (("\n" literal))) +;? (f:file-address <- index-address b:board-address/deref to-file:integer) +;? (dest:square-address <- index-address f:file-address/deref to-rank:integer) +;? (dest:square-address/deref <- copy src:square-address/deref) + (src:square-address/deref <- copy _:literal) + (reply b:board-address) +]) + (function main [ ;? (print-primitive (("\u2654 \u265a" literal))) (default-scope:scope-address <- new scope:literal 30:literal) @@ -162,7 +200,10 @@ (print-board b:board-address) (print-primitive (("? " literal))) (m:move-address <- read-move) - (loop) + (b:board-address <- make-move b:board-address m:move-address) +;? (loop) + (clear-screen) + (print-board b:board-address) } (console-off) ]) diff --git a/chessboard.mu b/chessboard.mu index e0a79656..5402bd95 100644 --- a/chessboard.mu +++ b/chessboard.mu @@ -1,23 +1,24 @@ (function read-board [ (default-scope:scope-address <- new scope:literal 30:literal) - (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal - N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal - B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal - Q:literal P:literal _:literal _:literal _:literal _:literal p:literal q:literal - K:literal P:literal _:literal _:literal _:literal _:literal p:literal k:literal - B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal - N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal - R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal) - ; assert(length(initial-position) == 64) + (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal) +;? (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal +;? N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal +;? B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal +;? Q:literal P:literal _:literal _:literal _:literal _:literal p:literal q:literal +;? K:literal P:literal _:literal _:literal _:literal _:literal p:literal k:literal +;? B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal +;? N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal +;? R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal) + ; assert(length(initial-position) == 4) ;? (print-primitive (("list-length\n" literal))) (len:integer <- list-length initial-position:list-address) - (correct-length?:boolean <- equal len:integer 64:literal) + (correct-length?:boolean <- equal len:integer 4:literal) (assert correct-length?:boolean "chessboard had incorrect size") - (b:board-address <- new board:literal 8:literal) + (b:board-address <- new board:literal 2:literal) (col:integer <- copy 0:literal) (curr:list-address <- copy initial-position:list-address) { begin - (done?:boolean <- equal col:integer 8:literal) + (done?:boolean <- equal col:integer 2:literal) (break-if done?:boolean) ;? (print-primitive col:integer) ;? (print-primitive (("\n" literal))) @@ -32,10 +33,10 @@ (function read-file [ (default-scope:scope-address <- new scope:literal 30:literal) (cursor:list-address <- next-input) - (result:file-address <- new file:literal 8:literal) + (result:file-address <- new file:literal 2:literal) (row:integer <- copy 0:literal) { begin - (done?:boolean <- equal row:integer 8:literal) + (done?:boolean <- equal row:integer 2:literal) (break-if done?:boolean) ;? (print-primitive ((" " literal))) ;? (print-primitive row:integer) @@ -53,7 +54,7 @@ (function print-board [ (default-scope:scope-address <- new scope:literal 30:literal) (b:board-address <- next-input) - (row:integer <- copy 7:literal) + (row:integer <- copy 1:literal) ; print each row { begin (done?:boolean <- less-than row:integer 0:literal) @@ -61,23 +62,129 @@ ; print each square in the row (col:integer <- copy 0:literal) { begin - (done?:boolean <- equal col:integer 8:literal) + (done?:boolean <- equal col:integer 2:literal) (break-if done?:boolean) (f:file-address <- index b:board-address/deref col:integer) (s:square <- index f:file-address/deref row:integer) - (print-primitive s:square) - (print-primitive ((" " literal))) +;? (print-primitive s:square) +;? (print-primitive ((" " literal))) (col:integer <- add col:integer 1:literal) (loop) } - (print-primitive (("\n" literal))) +;? (print-primitive (("\n" literal))) (row:integer <- subtract row:integer 1:literal) (loop) } ]) +(and-record move [ + from:integer-integer-pair + to:integer-integer-pair +]) + +(address move-address (move)) + +(function read-move [ + (a:character <- copy ((#\a literal))) + (file-base:integer <- character-to-integer a:character) +;? (file-base:integer <- subtract file-base:integer 1:literal) + (one:character <- copy ((#\1 literal))) + (rank-base:integer <- character-to-integer one:character) +;? (rank-base:integer <- subtract rank-base:integer 1:literal) + ; get from-file + (c:character <- copy ((#\a literal))) ;wait-for-key) +;? (print-primitive c:character) + (from-file:integer <- character-to-integer c:character) + (from-file:integer <- subtract from-file:integer file-base:integer) + ; assert('a' <= from-file <= 'h') + (above-min:boolean <- greater-or-equal from-file:integer 0:literal) + (assert above-min:boolean (("from-file too low" literal))) + (below-max:boolean <- lesser-or-equal from-file:integer 1:literal) + (assert below-max:boolean (("from-file too high" literal))) + ; get from-rank + (c:character <- copy ((#\1 literal))) ;wait-for-key) +;? (print-primitive c:character) + (from-rank:integer <- character-to-integer c:character) + (from-rank:integer <- subtract from-rank:integer rank-base:integer) + ; assert(1 <= from-rank <= 2) + (above-min:boolean <- greater-or-equal from-rank:integer 0:literal) + (assert above-min:boolean (("from-rank too low" literal))) + (below-max:boolean <- lesser-or-equal from-rank:integer 1:literal) + (assert below-max:boolean (("from-rank too high" literal))) +;? ; slurp hyphen +;? (c:character <- wait-for-key) +;? (print-primitive c:character) +;? (hyphen?:boolean <- equal c:character ((#\- literal))) +;? (assert hyphen?:boolean (("expected hyphen" literal))) +;? ; get to-file +;? (c:character <- wait-for-key) +;? (print-primitive c:character) +;? (to-file:integer <- character-to-integer c:character) +;? (to-file:integer <- subtract to-file:integer file-base:integer) +;? ; assert('a' <= to-file <= 'h') +;? (above-min:boolean <- greater-or-equal to-file:integer 1:literal) +;? (assert above-min:boolean (("to-file too low" literal))) +;? (below-max:boolean <- lesser-or-equal to-file:integer 2:literal) +;? (assert below-max:boolean (("to-file too high" literal))) +;? ; get to-rank +;? (c:character <- wait-for-key) +;? (print-primitive c:character) +;? (to-rank:integer <- character-to-integer c:character) +;? (to-rank:integer <- subtract to-rank:integer rank-base:integer) +;? ; assert(1 <= to-rank <= 2) +;? (above-min:boolean <- greater-or-equal to-rank:integer 1:literal) +;? (assert above-min:boolean (("to-rank too low" literal))) +;? (below-max:boolean <- lesser-or-equal to-rank:integer 2:literal) +;? (assert below-max:boolean (("to-rank too high" literal))) + ; construct the move object + (result:move-address <- new move:literal) + (f:integer-integer-pair-address <- get-address result:move-address/deref from:offset) + (dest:integer-address <- get-address f:integer-integer-pair-address/deref 0:offset) + (dest:integer-address/deref <- copy from-file:integer) + (dest:integer-address <- get-address f:integer-integer-pair-address/deref 1:offset) + (dest:integer-address/deref <- copy from-rank:integer) +;? (t0:integer-integer-pair-address <- get-address result:move-address/deref to:offset) +;? (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 0:offset) +;? (dest:integer-address/deref <- copy to-file:integer) +;? (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 1:offset) +;? (dest:integer-address/deref <- copy to-rank:integer) + (reply result:move-address) +]) + +(function make-move [ + (default-scope:scope-address <- new scope:literal 30:literal) + (b:board-address <- next-input) + (m:move-address <- next-input) + (x:integer-integer-pair <- get m:move-address/deref from:offset) + (from-file:integer <- get x:integer-integer-pair 0:offset) +;? (print-primitive (("\n" literal))) +;? (print-primitive from-file:integer) +;? (print-primitive (("\n" literal))) + (from-rank:integer <- get x:integer-integer-pair 1:offset) +;? (print-primitive from-rank:integer) +;? (print-primitive (("\n" literal))) + (f:file-address <- index b:board-address/deref from-file:integer) + (src:square-address <- index-address f:file-address/deref from-rank:integer) +;? (x:integer-integer-pair <- get m:move-address/deref to:offset) +;? (to-file:integer <- get x:integer-integer-pair 0:offset) +;? ;? (print-primitive to-file:integer) +;? ;? (print-primitive (("\n" literal))) +;? (to-rank:integer <- get x:integer-integer-pair 1:offset) +;? ;? (print-primitive to-rank:integer) +;? ;? (print-primitive (("\n" literal))) +;? (f:file-address <- index-address b:board-address/deref to-file:integer) +;? (dest:square-address <- index-address f:file-address/deref to-rank:integer) +;? (dest:square-address/deref <- copy src:square-address/deref) + (src:square-address/deref <- copy _:literal) + (reply b:board-address) +]) + (function main [ ;? (print-primitive (("\u2654 \u265a" literal))) + (default-scope:scope-address <- new scope:literal 30:literal) (b:board-address <- read-board) (print-board b:board-address) + (m:move-address <- read-move) + (b:board-address <- make-move b:board-address m:move-address) + (print-board b:board-address) ]) diff --git a/mu.arc b/mu.arc index 1993f81e..52697ab9 100644 --- a/mu.arc +++ b/mu.arc @@ -236,6 +236,8 @@ (def run fn-names (freeze function*) (load-system-functions) +;? (write function*) +;? (quit) (= traces* (queue)) (each it fn-names (enq make-routine.it running-routines*)) @@ -368,7 +370,7 @@ (pop-stack routine*) (if empty.routine* (return ninstrs)) (when (pos '<- (body.routine* pc.routine*)) - (die "No results returned: @(body.routine* pc.routine*)")) + (die "No results returned: @(tostring:prn (body.routine* pc.routine*))")) (++ pc.routine*)) (++ curr-cycle*) (trace "run" "-- " int-canon.memory*) @@ -469,6 +471,10 @@ (withs (operand (canonize arg.0) elemtype typeinfo.operand!elem idx (m arg.1)) +;? (write arg.0) +;? (pr " => ") +;? (write operand) +;? (prn) (unless (< -1 idx array-len.operand) (die "@idx is out of bounds of array @operand")) (m `((,(+ v.operand @@ -724,10 +730,16 @@ (++ n)))) (def canonize (operand) +;? (tr "0: @operand") (ret operand +;? (prn "1: " operand) +;? (tr "1: " operand) ; todo: why does this die? (zap absolutize operand) +;? (tr "2: @(tostring write.operand)") (while (pos '(deref) metadata.operand) - (zap deref operand)))) + (zap deref operand) +;? (tr "3: @(tostring write.operand)") + ))) (def array-len (operand) (trace "array-len" operand) @@ -1545,7 +1557,7 @@ ;? (print-primitive ("arg now: " literal)) ;? (print-primitive a:string-address) ;? (print-primitive "@":literal) -;? print-primitive:a:string-address/deref ; todo: test (m on scoped array) +;? (print-primitive a:string-address/deref) ; todo: test (m on scoped array) ;? (print-primitive "\n":literal) ;? ;? (assert nil:literal) ; result-len = result-len + arg.length - 1 (for the 'underscore' being replaced) @@ -1730,6 +1742,7 @@ ;; load all provided files and start at 'main' (reset) +(new-trace "chessboard") ;? (set dump-trace*) (awhen (pos "--" argv) (map add-code:readfile (cut argv (+ it 1))) @@ -1741,6 +1754,7 @@ (run 'main) (if ($.current-charterm) ($.close-charterm)) (prn "\nmemory: " int-canon.memory*) -;? (prn completed-routines*) + (each routine completed-routines* + (aif rep.routine!error (prn "error - " it))) ) (reset) |