9f3b032a1ccf091fe97ce29f950adc6fe7c633db
[jackhill/mal.git] / gst / types.st
1 Object subclass: MALObject [
2 | type value meta |
3
4 type [ ^type ]
5 value [ ^value ]
6 meta [ ^meta ]
7
8 value: aValue [
9 value := aValue.
10 ]
11
12 meta: aMeta [
13 meta := aMeta.
14 ]
15
16 MALObject class >> new: type value: value meta: meta [
17 | object |
18 object := super new.
19 object init: type value: value meta: meta.
20 ^object
21 ]
22
23 init: aType value: aValue meta: aMeta [
24 type := aType.
25 value := aValue.
26 meta := aMeta.
27 ]
28
29 withMeta: meta [
30 | object |
31 object := self deepCopy.
32 object meta: meta.
33 ^object
34 ]
35
36 isPair [
37 ^(self type = #list or: [ self type = #vector ]) and:
38 [ self value notEmpty ]
39 ]
40
41 printOn: stream [
42 stream nextPutAll: '<';
43 nextPutAll: self class printString;
44 nextPutAll: ': ';
45 nextPutAll: value printString.
46 meta notNil ifTrue: [
47 stream nextPutAll: ' | '
48 nextPutAll: meta printString.
49 ].
50 stream nextPutAll: '>'.
51 ]
52
53 = x [
54 self type ~= x type ifTrue: [ ^false ].
55 ^self value = x value
56 ]
57
58 hash [
59 ^self value hash
60 ]
61 ]
62
63 MALObject subclass: MALTrue [
64 MALTrue class >> new [
65 ^super new: #true value: true meta: nil.
66 ]
67 ]
68
69 MALObject subclass: MALFalse [
70 MALFalse class >> new [
71 ^super new: #false value: false meta: nil.
72 ]
73 ]
74
75 MALObject subclass: MALNil [
76 MALNil class >> new [
77 ^super new: #nil value: nil meta: nil.
78 ]
79 ]
80
81 MALObject class extend [
82 True := MALTrue new.
83 False := MALFalse new.
84 Nil := MALNil new.
85
86 True [ ^True ]
87 False [ ^False ]
88 Nil [ ^Nil ]
89 ]
90
91 MALObject subclass: MALNumber [
92 MALNumber class >> new: value [
93 ^super new: #number value: value meta: nil.
94 ]
95 ]
96
97 MALObject subclass: MALString [
98 MALString class >> new: value [
99 ^super new: #string value: value meta: nil.
100 ]
101 ]
102
103 MALObject subclass: MALSymbol [
104 MALSymbol class >> new: value [
105 ^super new: #symbol value: value meta: nil.
106 ]
107 ]
108
109 MALObject subclass: MALKeyword [
110 MALKeyword class >> new: value [
111 ^super new: #keyword value: value meta: nil.
112 ]
113 ]
114
115 MALObject subclass: MALList [
116 MALList class >> new: value [
117 ^super new: #list value: value meta: nil.
118 ]
119
120 = x [
121 (x type ~= #list and: [ x type ~= #vector ]) ifTrue: [ ^false ].
122 ^self value = x value
123 ]
124 ]
125
126 MALObject subclass: MALVector [
127 MALVector class >> new: value [
128 ^super new: #vector value: value meta: nil.
129 ]
130
131 = x [
132 (x type ~= #vector and: [ x type ~= #list ]) ifTrue: [ ^false ].
133 ^self value = x value
134 ]
135 ]
136
137 MALObject subclass: MALMap [
138 MALMap class >> new: value [
139 ^super new: #map value: value meta: nil.
140 ]
141 ]
142
143 MALObject subclass: MALAtom [
144 MALAtom class >> new: value [
145 ^super new: #atom value: value meta: nil.
146 ]
147 ]
148
149 Error subclass: MALError [
150 description [ ^'A MAL-related error' ]
151 isResumable [ ^true ]
152
153 data [ ^self messageText ]
154 ]
155
156 MALError subclass: MALUnterminatedSequence [
157 MALUnterminatedSequence class >> new [ ^super new ]
158
159 messageText [ ^'expected ''', self basicMessageText, ''', got EOF' ]
160 ]
161
162 MALError subclass: MALUnexpectedToken [
163 MALUnexpectedToken class >> new [ ^super new ]
164
165 messageText [ ^'unexpected token: ''', self basicMessageText, '''']
166 ]
167
168 MALError subclass: MALEmptyInput [
169 MALEmptyInput class >> new [ ^super new ]
170
171 messageText [ ^'Empty input' ]
172 ]
173
174 MALError subclass: MALUnknownSymbol [
175 MALUnknownSymbol class >> new [ ^super new ]
176
177 messageText [ ^'''', self basicMessageText, ''' not found']
178 ]
179
180 MALError subclass: MALOutOfBounds [
181 MALOutOfBounds class >> new [ ^super new ]
182
183 messageText [ ^'Out of bounds' ]
184 ]
185
186 MALError subclass: MALCustomError [
187 MALCustomError class >> new [ ^super new ]
188
189 messageText [ ^Printer prStr: self basicMessageText printReadably: true ]
190 data [ ^self basicMessageText ]
191 ]