;; data structure: board (primitive square) (address square-address (square)) ; pointer. verbose but sadly necessary for now (array file (square)) ; ranks and files are arrays of squares (address file-address (file)) (address file-address-address (file-address)) ; pointer to a pointer (array board (file-address)) (address board-address (board)) (function init-board [ (default-space:space-address <- new space:literal 30:literal) (initial-position:integer-array-address <- next-input) ; assert(length(initial-position) == 64) ;? ($print initial-position:integer-array-address/deref) ;? 1 (len:integer <- length initial-position:integer-array-address/deref) ;? ($print len:integer) ;? 1 ;? ($print (("\n" literal))) ;? 1 (correct-length?:boolean <- equal len:integer 64:literal) (assert correct-length?:boolean (("chessboard had incorrect size" literal))) (b:board-address <- new board:literal 8:literal) (col:integer <- copy 0:literal) { begin (done?:boolean <- equal col:integer 8:literal) (break-if done?:boolean) (file:file-address-address <- index-address b:board-address/deref col:integer) (file:file-address-address/deref <- init-file initial-position:integer-array-address col:integer) (col:integer <- add col:integer 1:literal) (loop) } (reply b:board-address) ]) (function init-file [ (default-space:space-address <- new space:literal 30:literal) (position:integer-array-address <- next-input) (index:integer <- next-input) (index:integer <- multiply index:integer 8:literal) (result:file-address <- new file:literal 8:literal) (row:integer <- copy 0:literal) { begin (done?:boolean <- equal row:integer 8:literal) (break-if done?:boolean) (dest:square-address <- index-address result:file-address/deref row:integer) (dest:square-address/deref <- index position:integer-array-address/deref index:integer) (row:integer <- add row:integer 1:literal) (index:integer <- add index:integer 1:literal) (loop) } (reply result:file-address) ]) (function print-board [ (default-space:space-address <- new space:literal 30:literal) (screen:terminal-address <- next-input) (b:board-address <- next-input) (row:integer <- copy 7:literal) ; print each row { begin (done?:boolean <- less-than row:integer 0:literal) (break-if done?:boolean) ; print rank number as a legend (rank:integer <- add row:integer 1:literal) (print-integer screen:terminal-address rank:integer) (s:string-address <- new " | ") (print-string screen:terminal-address s:string-address) ; print each square in the row (col:integer <- copy 0:literal) { begin (done?:boolean <- equal col:integer 8: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-character screen:terminal-address s:square) (print-character screen:terminal-address ((#\space literal))) (col:integer <- add col:integer 1:literal) (loop) } (row:integer <- subtract row:integer 1:literal) (cursor-to-next-line screen:terminal-address) (loop) } ; print file letters as legend (s:string-address <- new " +----------------") (print-string screen:terminal-address s:string-address) (cursor-to-next-line screen:terminal-address) (s:string-address <- new " a b c d e f g h") (print-string screen:terminal-address s:string-address) (cursor-to-next-line screen:terminal-address) ]) ;; data stru
discard """
output: "5"
"""
# bug #2346, bug #2404
import mvarconcept
echo randomInt(5)