blob: e9fbd1011586d02894346674a11cc362a91893d0 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
;; 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 read-board [
(default-space:space-address <- new space: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)
;? (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")
(b:board-address <- new board:literal 8:literal)
(col:integer <- copy 0:literal)
(curr:list-address <- copy initial-position:list-address)
{ begin
(done?:boolean <- equal col:integer 8:literal)
(break-if done?:boolean)
;? (print-primitive col:integer)
;? (print-primitive (("\n" literal)))
(file:file-address-address <- index-address b:board-address/deref col:integer)
(file:file-address-address/deref curr:list-address <- read-file curr:list-address)
(col:integer <- add col:integer 1:literal)
(loop)
}
(reply b:board-address)
])
(function read-file [
(default-space:space-address <- new space:literal 30:literal)
(cursor:list-address <- next-input)
(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)
;? (print-primitive ((" " literal)))
;? (print-primitive row:integer)
;? (print-primitive (("\n" literal)))
(src:tagged-value-address <- list-value-address cursor:list-address)
(dest:square-address <- index-address result:file-address/deref row:integer)
(dest:square-address/deref <- get src:tagged-value-address/deref payload:offset) ; unsafe typecast
(cursor:list-address <- list-next cursor:list-address)
(row:integer <- add row:integer 1:literal)
(loop)
}
(reply result:file-address cursor:list-address)
])
(function print-board [
(default-space:space-address <- new space:literal 30:literal)
(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 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-primitive s:square)
(print-primitive ((" " literal)))
(col:integer <- add col:integer 1:literal)
(loop)
}
(print-primitive (("\n" literal)))
(row:integer <- subtract row:integer 1:literal)
(loop)
}
])
(function main [
;? (print-primitive (("\u2654 \u265a" literal)))
(default-space:space-address <- new space:literal 30:literal)
(b:board-address <- read-board)
(print-board b:board-address)
])
|