mirror of
https://github.com/kanaka/mal.git
synced 2024-11-11 00:52:44 +03:00
209 lines
4.2 KiB
Smalltalk
209 lines
4.2 KiB
Smalltalk
Object subclass: MALObject [
|
|
| type value meta |
|
|
|
|
type [ ^type ]
|
|
value [ ^value ]
|
|
meta [ ^meta ]
|
|
|
|
value: aValue [
|
|
value := aValue.
|
|
]
|
|
|
|
meta: aMeta [
|
|
meta := aMeta.
|
|
]
|
|
|
|
MALObject class >> new: type value: value meta: meta [
|
|
| object |
|
|
object := super new.
|
|
object init: type value: value meta: meta.
|
|
^object
|
|
]
|
|
|
|
init: aType value: aValue meta: aMeta [
|
|
type := aType.
|
|
value := aValue.
|
|
meta := aMeta.
|
|
]
|
|
|
|
withMeta: meta [
|
|
| object |
|
|
object := self deepCopy.
|
|
object meta: meta.
|
|
^object
|
|
]
|
|
|
|
isPair [
|
|
^(self type = #list or: [ self type = #vector ]) and:
|
|
[ self value notEmpty ]
|
|
]
|
|
|
|
printOn: stream [
|
|
stream nextPutAll: '<';
|
|
nextPutAll: self class printString;
|
|
nextPutAll: ': ';
|
|
nextPutAll: value printString.
|
|
meta notNil ifTrue: [
|
|
stream nextPutAll: ' | '
|
|
nextPutAll: meta printString.
|
|
].
|
|
stream nextPutAll: '>'.
|
|
]
|
|
|
|
= x [
|
|
self type ~= x type ifTrue: [ ^false ].
|
|
^self value = x value
|
|
]
|
|
|
|
hash [
|
|
^self value hash
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALTrue [
|
|
MALTrue class >> new [
|
|
^super new: #true value: true meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALFalse [
|
|
MALFalse class >> new [
|
|
^super new: #false value: false meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALNil [
|
|
MALNil class >> new [
|
|
^super new: #nil value: nil meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject class extend [
|
|
True := MALTrue new.
|
|
False := MALFalse new.
|
|
Nil := MALNil new.
|
|
|
|
True [ ^True ]
|
|
False [ ^False ]
|
|
Nil [ ^Nil ]
|
|
]
|
|
|
|
MALObject subclass: MALNumber [
|
|
MALNumber class >> new: value [
|
|
^super new: #number value: value meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALString [
|
|
MALString class >> new: value [
|
|
^super new: #string value: value meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALSymbol [
|
|
MALSymbol class >> new: value [
|
|
^super new: #symbol value: value meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALKeyword [
|
|
MALKeyword class >> new: value [
|
|
^super new: #keyword value: value meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALList [
|
|
MALList class >> new: value [
|
|
^super new: #list value: value meta: nil.
|
|
]
|
|
|
|
= x [
|
|
(x type ~= #list and: [ x type ~= #vector ]) ifTrue: [ ^false ].
|
|
^self value = x value
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALVector [
|
|
MALVector class >> new: value [
|
|
^super new: #vector value: value meta: nil.
|
|
]
|
|
|
|
= x [
|
|
(x type ~= #vector and: [ x type ~= #list ]) ifTrue: [ ^false ].
|
|
^self value = x value
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALMap [
|
|
MALMap class >> new: value [
|
|
^super new: #map value: value meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: MALAtom [
|
|
MALAtom class >> new: value [
|
|
^super new: #atom value: value meta: nil.
|
|
]
|
|
]
|
|
|
|
MALObject subclass: Fn [
|
|
| fn |
|
|
|
|
fn [ ^fn ]
|
|
|
|
Fn class >> new: fn [
|
|
| f |
|
|
f := super new: #fn value: fn meta: nil.
|
|
f init: fn.
|
|
^f
|
|
]
|
|
|
|
init: f [
|
|
fn := f.
|
|
]
|
|
]
|
|
|
|
Error subclass: MALError [
|
|
description [ ^'A MAL-related error' ]
|
|
isResumable [ ^true ]
|
|
|
|
data [ ^self messageText ]
|
|
]
|
|
|
|
MALError subclass: MALUnterminatedSequence [
|
|
MALUnterminatedSequence class >> new [ ^super new ]
|
|
|
|
messageText [ ^'expected ''', self basicMessageText, ''', got EOF' ]
|
|
]
|
|
|
|
MALError subclass: MALUnexpectedToken [
|
|
MALUnexpectedToken class >> new [ ^super new ]
|
|
|
|
messageText [ ^'unexpected token: ''', self basicMessageText, '''']
|
|
]
|
|
|
|
MALError subclass: MALEmptyInput [
|
|
MALEmptyInput class >> new [ ^super new ]
|
|
|
|
messageText [ ^'Empty input' ]
|
|
]
|
|
|
|
MALError subclass: MALUnknownSymbol [
|
|
MALUnknownSymbol class >> new [ ^super new ]
|
|
|
|
messageText [ ^'''', self basicMessageText, ''' not found']
|
|
]
|
|
|
|
MALError subclass: MALOutOfBounds [
|
|
MALOutOfBounds class >> new [ ^super new ]
|
|
|
|
messageText [ ^'Out of bounds' ]
|
|
]
|
|
|
|
MALError subclass: MALCustomError [
|
|
MALCustomError class >> new [ ^super new ]
|
|
|
|
messageText [ ^Printer prStr: self basicMessageText printReadably: true ]
|
|
data [ ^self basicMessageText ]
|
|
]
|