comparison code/dotScanner.lm @ 25:ec0b74f4f2d9

Merge
author William Morgan <billjunk@mrgn.org>
date Fri, 25 Jul 2014 22:52:52 -0700
parents 37158acf31e5 5ded24518dc5
children 4f7a421e77c6
comparison
equal deleted inserted replaced
24:37158acf31e5 25:ec0b74f4f2d9
1 #{ 1 #{
2 length <- :lst {
3 len <- []
4 while: { not: (lst isInteger?)} do: {
5 lst <- lst tail
6 len <- len + 1
7 }
8 len
9 }
10
11 reverse <- :lst {
12 new <- []
13 while: { not: (lst isInteger?)} do: {
14 new <- (lst value) | new
15 lst <- lst tail
16 }
17 new
18 }
19
20 split:at <- :lst :pos {
21 first <- []
22 i <- 0
23 while: { i < pos } do: {
24 first <- (lst value) | first
25 lst <- lst tail
26 i <- i + 1
27 }
28 #[(reverse: first) lst]
29 }
30
31 map <- :lst fun {
32 new <- []
33 while: { not: (lst isInteger?) } do: {
34 new <- (fun: (lst value)) | new
35 lst <- lst tail
36 }
37 reverse: new
38 }
39
40 fold:with <- :lst acc :fun {
41 while: { not: (lst isInteger?) } do: {
42 acc <- fun: acc (lst value)
43 lst <- lst tail
44 }
45 acc
46 }
47
48 filter <- :lst pred {
49 new <- []
50 while: { not: (lst isInteger?) } do: {
51 if: (pred: (lst value)) {
52 new <- (lst value) | new
53 } else: {}
54 lst <- lst tail
55 }
56 reverse: new
57 }
58
59 makeTree:size <- :lst :size {
60 ret <- 0
61 sub <- 0
62 half <- size / 2
63 if: size = 2 {
64 ret <- #[(lst value) ((lst tail) value)]
65 } else: {
66 if: size = 1 {
67 ret <- lst
68 } else: {
69 sub <- split: lst at: half
70 ret <- #[
71 (makeTree: (sub value) size: half)
72 (makeTree: (sub tail) size: size-half)
73 ]
74 }
75 }
76 ret
77 }
78
79 makeTree <- :lst {
80 size <- lst length
81 #[size (makeTree: lst size: size)]
82 }
83
84 get:fromTree:size <- :idx :tree :size {
85 print: #[1 tree size]
86 ret <- 0
87 half <- size / 2
88 if: size <= 2 {
89 if: idx = 0 {
90 ret <- tree value
91 } else: {
92 ret <- tree tail
93 }
94 } else: {
95 if: idx < half {
96 ret <- get: idx fromTree: (tree value) size: half
97 } else: {
98 ret <- get: idx-half fromTree: (tree tail) size: size-half
99 }
100 }
101 ret
102 }
103
104 get:fromTree <- :idx :tree {
105 size <- tree value
106 print: #[0 size]
107 get: idx fromTree: (tree tail) size: size
108 }
109
110 treeMap:size <- :tree fun :size {
111 ret <- 0
112 half <- size / 2
113 if: size = 2 {
114 ret <- #[(fun: (tree value)) (fun: (tree tail))]
115 } else: {
116 if: size = 1 {
117 ret <- #[(fun: (tree value)) 0]
118 } else: {
119 ret <- #[
120 (treeMap: (tree value) fun size: half)
121 (treeMap: (tree tail) fun size: size-half)
122 ]
123 }
124 }
125 ret
126 }
127
128 treeMap <- :tree fun {
129 #[(tree value) (treeMap: (tree tail) fun size: (tree value))]
130 }
131
132 tree:size:update:with <- :tree :size :idx :fun {
133 ret <- 0
134 half <- size / 2
135 if: size = 2 {
136 if: idx = 0 {
137 ret <- #[(fun: (tree value)) (tree tail)]
138 } else: {
139 ret <- #[(tree value) (fun: (tree tail))]
140 }
141 } else: {
142 if: size = 1 {
143 ret <- #[(fun: (tree value)) 0]
144 } else: {
145 if: (idx < half) {
146 ret <- #[
147 (tree: (tree value) size: half update: idx with: fun)
148 (tree tail)
149 ]
150 } else: {
151 ret <- #[
152 (tree value)
153 (tree: (tree tail) size: size-half update: idx-half with: fun)
154 ]
155 }
156 }
157 }
158 ret
159 }
160
161 tree:update:with <- :tree :idx :fun {
162 #[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)]
163 }
164
165 tree:set:to <- :tree :idx :val {
166 tree: tree update: idx with: :el { val }
167 }
168
169 grid:update:with <- :grid :pos :fun {
170 x <- pos value
171 y <- pos tail
172 tree: grid update: y with: :row {
173 tree: row update: x with: fun
174 }
175 }
176
177 grid:set:to <- :grid :pos :val {
178 grid: grid update: pox with: :el { val }
179 }
180
2 /* 181 /*
3 ListGet <- :cell idx { 182 ListGet <- :cell idx {
4 if: idx = 0 {cell value} else: { 183 if: idx = 0 {cell value} else: {
5 ListGet: (cell tail) (idx - 1) 184 ListGet: (cell tail) (idx - 1)
6 } 185 }
54 233
55 //scanFor <- :target visited { 234 //scanFor <- :target visited {
56 //} 235 //}
57 counterLoad <- 4 236 counterLoad <- 4
58 step <- :myState world { 237 step <- :myState world {
59 print: (world value) 238 grid <- makeTree: (map: (world value) :row { makeTree: row })
239 lmState <- (world value) tail
240 myLoc <- (lmState tail) value
241
242
243 visited <- treeMap: grid :el { 0 }
244 visited <- tree: visited set: myLoc to: 1
245
246
247
60 //myPos <- 248 //myPos <-
61 path <- [3 1 3 1] //scanFor: 2 3 [myPos] 249 path <- [3 1 3 1] //scanFor: 2 3 [myPos]
62 move <- myState value 250 move <- myState value
63 counter <- (myState tail) - 1 251 counter <- (myState tail) - 1
64 if: counter = 0 { 252 if: counter = 0 {
66 counter <- counterLoad 254 counter <- counterLoad
67 if: move = 4 { 255 if: move = 4 {
68 move <- 0 256 move <- 0
69 } else: {} 257 } else: {}
70 } else: {} 258 } else: {}
71 #[#[move counter] ((path tail) value)] 259 #[0 ((path tail) value)]
72 } 260 }
73 261
74 main <- :initWorld mystery { 262 main <- :initWorld mystery {
75 #[#[0 counterLoad] step] 263 #[0 step]
76 } 264 }
77 } 265 }
78 266
79 //does not work: 267 //does not work:
80 //someListOrTup get: 0 268 //someListOrTup get: 0