Mercurial > repos > tabletprog
annotate modules/list.tp @ 331:61f5b794d939
Breaking change: method call syntax now always uses the syntactic receiver as the actual receiver. This makes its behavior different from function call syntax, but solves some problems with methods being shadowed by local variables and the like.
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 28 Mar 2015 14:21:04 -0700 |
parents | eef8a5cea812 |
children |
rev | line source |
---|---|
170
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 _empty <- #{ |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 length <- { 0 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 empty? <- { true } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 fold:with <- :acc :fun { acc } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 foldr:with <- :acc :fun { acc } |
308 | 7 filter <- :pred { self } |
300
ea94b1e43c97
Add foreach to empty list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
8 foreach <- :self fun { self } |
170
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 map <- :fun { self } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 | <- :val { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 list node: val withTail: self |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 . <- :right { right } |
190
372cbd2cd243
Added reverse method to lists
Mike Pavone <pavone@retrodev.com>
parents:
188
diff
changeset
|
14 reverse <- { self } |
188 | 15 join <- { "" } |
215
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
16 contains? <- :val { false } |
309
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
17 find <- :pred { option none } |
173
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
18 string <- { "[]" } |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
19 print <- { print: string } |
271
bb4723fec05e
Support for encoding objects, dictionaries, lists and arrays to JSON in json module
Michael Pavone <pavone@retrodev.com>
parents:
215
diff
changeset
|
20 jsonEncode <- { "[]" } |
170
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 #{ |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 empty <- { _empty } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 node:withTail <- :_val :_tail { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 #{ |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 value <- { _val } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 tail <- { _tail } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 empty? <- { false } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 length <- { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 fold: 0 with: :acc val { acc + 1 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 fold:with <- :acc :fun { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 cur <- self |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 while: { not: (cur empty?)} do: { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 acc <- fun: acc (cur value) |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 cur <- cur tail |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 acc |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 foldr:with <- :acc fun { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 fun: (_tail foldr: acc with: fun) _val |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 } |
308 | 43 filter <- :pred { |
44 reverse: (fold: [] with: :acc el { | |
45 if: (pred: el) { el | acc } else: { acc } | |
46 }) | |
47 } | |
170
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 map <- :fun { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 node: (fun: _val) withTail: (_tail map: fun) |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 } |
173
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
51 foreach <- :self fun { |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
52 fold: 0 with: :idx el{ |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
53 fun: idx el |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
54 idx + 1 |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
55 } |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
56 self |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
57 } |
170
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 | <- :val { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 node: val withTail: self |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 . <- :right { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 foldr: right with: :tail val { |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 node: val withTail: tail |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 } |
190
372cbd2cd243
Added reverse method to lists
Mike Pavone <pavone@retrodev.com>
parents:
188
diff
changeset
|
66 reverse <- { |
372cbd2cd243
Added reverse method to lists
Mike Pavone <pavone@retrodev.com>
parents:
188
diff
changeset
|
67 fold: [] with: :tail val { |
372cbd2cd243
Added reverse method to lists
Mike Pavone <pavone@retrodev.com>
parents:
188
diff
changeset
|
68 node: val withTail: tail |
372cbd2cd243
Added reverse method to lists
Mike Pavone <pavone@retrodev.com>
parents:
188
diff
changeset
|
69 } |
372cbd2cd243
Added reverse method to lists
Mike Pavone <pavone@retrodev.com>
parents:
188
diff
changeset
|
70 } |
188 | 71 join <- :sep { |
72 _tail fold: (string: _val) with: :acc el { | |
73 acc . sep . el | |
74 } | |
75 } | |
215
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
76 contains? <- :val { |
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
77 if: _val = val { |
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
78 true |
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
79 } else: { |
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
80 _tail contains?: val |
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
81 } |
f3d5068cbd43
Add contains? method to list
Michael Pavone <pavone@retrodev.com>
parents:
190
diff
changeset
|
82 } |
309
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
83 |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
84 find <- :pred { |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
85 if: (pred: _val) { |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
86 option value: _val |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
87 } else: { |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
88 _tail find: pred |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
89 } |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
90 } |
ed908b7fcec6
Add find method to list
Michael Pavone <pavone@retrodev.com>
parents:
271
diff
changeset
|
91 |
173
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
92 string <- { |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
93 (fold: "[\n" with: :acc el { |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
94 acc . " " . (string: el) . "\n" |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
95 }) . "]" |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
96 } |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
97 print <- { |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
98 print: "[\n" |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
99 foreach: :_ el { |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
100 print: " " . (string: el) . "\n" |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
101 } |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
102 print: "]" |
158444b77c09
Added foreach, string and print to list objects
Mike Pavone <pavone@retrodev.com>
parents:
170
diff
changeset
|
103 } |
271
bb4723fec05e
Support for encoding objects, dictionaries, lists and arrays to JSON in json module
Michael Pavone <pavone@retrodev.com>
parents:
215
diff
changeset
|
104 |
bb4723fec05e
Support for encoding objects, dictionaries, lists and arrays to JSON in json module
Michael Pavone <pavone@retrodev.com>
parents:
215
diff
changeset
|
105 jsonEncode <- { |
329
eef8a5cea812
Use a smarter algorithm for calculating module init order and break some circular module dependencies in the standard library
Michael Pavone <pavone@retrodev.com>
parents:
311
diff
changeset
|
106 parts <- map: :el { jsonEncoder encode: el } |
271
bb4723fec05e
Support for encoding objects, dictionaries, lists and arrays to JSON in json module
Michael Pavone <pavone@retrodev.com>
parents:
215
diff
changeset
|
107 "[" . (parts join: ",") . "]" |
bb4723fec05e
Support for encoding objects, dictionaries, lists and arrays to JSON in json module
Michael Pavone <pavone@retrodev.com>
parents:
215
diff
changeset
|
108 } |
170
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 } |
18598163e3ef
Add linked list implementation and cons operator
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 } |