class Apex(nil) { dcl(#class) sysdic. ## ------------------------------------------------------- ## ------------------------------------------------------- method(#class) dump { } method dump { } ## ------------------------------------------------------- ## ------------------------------------------------------- method(#class) yourself { ^self. } method yourself { ^self. } ## ------------------------------------------------------- ## ------------------------------------------------------- method(#class) basicNew { self primitiveFailed. } method(#class) basicNew: anInteger { self primitiveFailed. } method(#class) ngcNew { self primitiveFailed. } method(#class) ngcNew: anInteger { self primitiveFailed. } method(#class) new { | x | x := self basicNew. x initialize. "TODO: assess if it's good to call 'initialize' from new." ^x. } method(#class) new: anInteger { | x | ## TODO: check if the class is a fixed class. ## if so, raise an exception. x := self basicNew: anInteger. x initialize. "TODO: assess if it's good to call 'initialize' from new." ^x. } method initialize { "a subclass may override this method." ^self. } method ngcDispose { self primitiveFailed. } ## ------------------------------------------------------- ## ------------------------------------------------------- method shallowCopy { self primitiveFailed. } ## ------------------------------------------------------- ## ------------------------------------------------------- method class { } method(#class) class { ^Class } ## ------------------------------------------------------- ## ------------------------------------------------------- method basicSize { self primitiveFailed. } method(#class) basicSize { self primitiveFailed. } method basicAt: index { self index: index outOfRange: (self basicSize). } method basicAt: index put: anObject { self index: index outOfRange: (self basicSize). } method(#class) basicAt: index { self index: index outOfRange: (self basicSize). } method(#class) basicAt: index put: anObject { self index: index outOfRange: (self basicSize). } (* ------------------------------------------------------------------ * HASHING * ------------------------------------------------------------------ *) method hash { self subclassResponsibility: #hash } method(#class) hash { self subclassResponsibility: #hash } (* ------------------------------------------------------------------ * IDENTITY TEST * ------------------------------------------------------------------ *) method == anObject { (* check if the receiver is identical to anObject. * this doesn't compare the contents *) self primitiveFailed. } method ~~ anObject { ^(self == anObject) not. } method(#class) == anObject { (* check if the receiver is identical to anObject. * this doesn't compare the contents *) self primitiveFailed. } method(#class) ~~ anObject { ^(self == anObject) not. } (* ------------------------------------------------------------------ * EQUALITY TEST * ------------------------------------------------------------------ *) method = anObject { self subclassResponsibility: #= } method ~= anObject { ^(self = anObject) not. } method(#class) = anObject { self subclassResponsibility: #= } method(#class) ~= anObject { ^(self = anObject) not. } (* ------------------------------------------------------------------ * COMMON QUERIES * ------------------------------------------------------------------ *) method isNil { "^self == nil." ^false } method notNil { "^(self == nil) not" "^self ~= nil." ^true. } method(#class) isNil { "^self == nil." ^false } method(#class) notNil { "^(self == nil) not" "^self ~= nil." ^true. } method isError { ^false } method(#class) isError { ^false } ## ------------------------------------------------------- ## ------------------------------------------------------- method(#class) inheritsFrom: aClass { | c | c := self superclass. [c notNil] whileTrue: [ [ c == aClass ] ifTrue: [^true]. c := c superclass. ]. ^false } method(#class) isMemberOf: aClass { (* a class object is an instance of Class * but Class inherits from Apex. On the other hand, * most of ordinary classes are under Object again under Apex. * special consideration is required here. *) ^aClass == Class } method(#class) isKindOf: aClass { ^(self isMemberOf: aClass) or: [self inheritsFrom: aClass]. } method isMemberOf: aClass { ^self class == aClass } method isKindOf: aClass { ^(self isMemberOf: aClass) or: [self class inheritsFrom: aClass]. } (* ----------------- method(#class) respondsTo: selectorSymbol { TODO: find selectorSymbol in the class method dictionary... } method respondsTo: selectorSymbol { TODO: find selectorSymbol in the method dictionary... } ------------ *) method exceptionizeError: trueOrFalse { self class cannotExceptionizeError } (* ------------------------------------------------------------------ * COMMON ERROR/EXCEPTION HANDLERS * ------------------------------------------------------------------ *) method primitiveFailed { self class primitiveFailed. } method doesNotUnderstand: messageSymbol { self class doesNotUnderstand: messageSymbol } method index: index outOfRange: ubound { self class index: index outOfRange: ubound. } method cannotInstantiate { self class cannotInstantiate } method subclassResponsibility: message_name { self class subclassResponsibility: message_name } method cannotExceptionizeError { self class cannotExceptionizeError } method(#class) error: msgText { ## TODO: implement this ## Error signal: msgText. msgText dump. } method error: aString { self class error: aString. } } class Object(Apex) { } class UndefinedObject(Apex) { method isNil { ^true } method notNil { ^false. } method handleException: exception { ('### EXCEPTION NOT HANDLED #### ' & exception class name & ' - ' & exception messageText) dump. ## TODO: debug the current process???? " ## TODO: ensure to execute ensure blocks as well.... ####Processor activeProcess terminate. } } pooldic ErrorCode { (* migrate it into Error class *) #NONE := error(0). #GENERIC := error(1). #NOENT := error(2). } class Error(Apex) { (* ---------------------------- TODO: support constant declaration... #const { #NONE := error(0). #GENERIC := error(1). } -------------------------------- *) method isError { ^true } method asInteger { } method asCharacter { } method asString { } }