1
1
mirror of https://github.com/kanaka/mal.git synced 2024-11-11 00:52:44 +03:00
mal/gnu-smalltalk/types.st
2018-06-17 19:54:54 +02:00

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 ]
]