1 Object subclass: MALObject [
16 MALObject class >>
new: type
value: value
meta: meta
[
19 object
init: type
value: value
meta: meta
.
23 init: aType
value: aValue
meta: aMeta
[
31 object
:= self deepCopy
.
37 ^(self type
= #list or: [ self type
= #vector ]) and:
38 [ self value notEmpty
]
42 stream
nextPutAll: '<';
43 nextPutAll: self class printString
;
45 nextPutAll: value printString
.
47 stream
nextPutAll: ' | '
48 nextPutAll: meta printString
.
50 stream
nextPutAll: '>'.
54 self type ~
= x type
ifTrue: [ ^false ].
63 MALObject subclass: MALTrue [
64 MALTrue class >> new
[
65 ^super new: #true value: true meta: nil.
69 MALObject subclass: MALFalse [
70 MALFalse class >> new
[
71 ^super new: #false value: false meta: nil.
75 MALObject subclass: MALNil [
77 ^super new: #nil value: nil meta: nil.
81 MALObject class extend
[
83 False := MALFalse new
.
91 MALObject subclass: MALNumber [
92 MALNumber class >>
new: value
[
93 ^super new: #number value: value
meta: nil.
97 MALObject subclass: MALString [
98 MALString class >>
new: value
[
99 ^super new: #string value: value
meta: nil.
103 MALObject subclass: MALSymbol [
104 MALSymbol class >>
new: value
[
105 ^super new: #symbol value: value
meta: nil.
109 MALObject subclass: MALKeyword [
110 MALKeyword class >>
new: value
[
111 ^super new: #keyword value: value
meta: nil.
115 MALObject subclass: MALList [
116 MALList class >>
new: value
[
117 ^super new: #list value: value
meta: nil.
121 (x type ~
= #list and: [ x type ~
= #vector ]) ifTrue: [ ^false ].
122 ^self value
= x value
126 MALObject subclass: MALVector [
127 MALVector class >>
new: value
[
128 ^super new: #vector value: value
meta: nil.
132 (x type ~
= #vector and: [ x type ~
= #list ]) ifTrue: [ ^false ].
133 ^self value
= x value
137 MALObject subclass: MALMap [
138 MALMap class >>
new: value
[
139 ^super new: #map value: value
meta: nil.
143 MALObject subclass: MALAtom [
144 MALAtom class >>
new: value
[
145 ^super new: #atom value: value
meta: nil.
149 MALObject subclass: Fn [
154 Fn class >>
new: fn
[
156 f
:= super new: #fn value: fn
meta: nil.
166 Error subclass: MALError [
167 description
[ ^'A MAL-related error' ]
168 isResumable
[ ^true ]
170 data
[ ^self messageText
]
173 MALError subclass: MALUnterminatedSequence [
174 MALUnterminatedSequence class >> new
[ ^super new
]
176 messageText
[ ^'expected ''',
self basicMessageText,
''', got EOF' ]
179 MALError subclass: MALUnexpectedToken [
180 MALUnexpectedToken class >> new
[ ^super new
]
182 messageText
[ ^'unexpected token: ''',
self basicMessageText,
'''']
185 MALError subclass: MALEmptyInput [
186 MALEmptyInput class >> new
[ ^super new
]
188 messageText
[ ^'Empty input' ]
191 MALError subclass: MALUnknownSymbol [
192 MALUnknownSymbol class >> new
[ ^super new
]
194 messageText
[ ^'''',
self basicMessageText,
''' not found']
197 MALError subclass: MALOutOfBounds [
198 MALOutOfBounds class >> new
[ ^super new
]
200 messageText
[ ^'Out of bounds' ]
203 MALError subclass: MALCustomError [
204 MALCustomError class >> new
[ ^super new
]
206 messageText
[ ^Printer prStr: self basicMessageText
printReadably: true ]
207 data
[ ^self basicMessageText
]