On Thu, Aug 15, 2024 at 8:05 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at> wrote:
> It seems that "instanceMethods", without a class_object argument, does not > return all the class methods that are available to the receiving class > object (whereas it returns correctly all the instance methods in the case > of instances). > > The following code will invoke the routine "testInstanceMethods" with the > class object .String, and then once more with a string instance with the > value "hello world" in this case. > > The routine "testInstanceMethods" checks whether the argument is a class > object and if so uses it as the starting class to send the instanceMethods > message, and if not gets the class object of an instance of a class. If a > class object, then also the instance methods of .Class get queried in > addition as these methods will be available as instance methods to any > class object. > > Next the superclasses of that clz get queried and as a result a loop over > the classes .String, .Object, and .Comparable will be executed to get first > the instance methods for each class, which get counted and collected, > followed by querying all instanceMethods without a class_object argument. > > Here the respective code: > > call testInstanceMethods .stringsay "="~copies(79)saycall testInstanceMethods > "hello world" > > > ::routine testInstanceMethods > use arg obj > bIsClassObject=obj~isA(.class) > if bIsClassObject then clz=obj > else clz=obj~class > > say "instanceMethods of" pp(obj)":" superclasses=clz~superClasses -- get > array of superclasses say "=============" say "superclasses:" > ppDoOver(superclasses)~makeString(, ', ') > say "=============" say sum=0 arrMeths=.array~new > classes2ask = .array~of(clz)~~appendAll(superclasses) > if bIsClassObject then classes2ask~append(.class) -- we have also the > methods of .class available -- do o over > .array~of(clz)~~appendAll(superclasses) do o over classes2ask > tmpObj=bIsClassObject~?(o,obj) > > arrOMeths=ppDoOver(.array~new~appendall(tmpObj~instanceMethods(o)~allIndexes~sort)) > arrMeths~appendAll(arrOMeths) > sum+=arrOMeths~items > say "---> " pp(tmpObj)"~instanceMethods("pp(o)"), arrOMeths~items:" > pp(arrOMeths~items)", methods:" if arrOMeths~items>0 then say " > " arrOMeths~makeString(, ', ') > say end say say "arrMeths~items:" arrMeths~items "sum:" sum > say "-"~copies(79) > say tmpObj=bIsClassObject~?(clz,obj) > say "allMeths, result of:" pp(tmpObj)"~instanceMethods:" > allMeths=ppDoOver((bIsClassObject~?(o,obj))~instanceMethods~allIndexes~sort) > say "allMeths~items:" allMeths~items > say "===> allMeths:"allMeths~makeString(, ', ') > say "allMeths~items:" allMeths~items > say > > ::routine pp > return "["arg(1)"]"::routine ppDoOver > use arg o > arrOut=.array~new > do val over o > arrOut~append(pp(val)) > end return arrOut > > Running this program will yield the following output: > > instanceMethods of [The String class]: > ============= > superclasses: [The Object class], [The Comparable class] > ============= > > ---> [The String class]~instanceMethods([The String class]), > arrOMeths~items: [17], methods: > [ALNUM], [ALPHA], [BLANK], [CNTRL], [CR], [DIGIT], [GRAPH], [LOWER], > [NEW], [NL], [NULL], [PRINT], [PUNCT], [SPACE], [TAB], [UPPER], [XDIGIT] > > ---> [The Object class]~instanceMethods([The Object class]), > arrOMeths~items: [33], methods: > [], [ ], [<>], [=], [==], [><], [CLASS], [COPY], [DEFAULTNAME], > [HASHCODE], [HASMETHOD], [IDENTITYHASH], [INIT], [INSTANCEMETHOD], > [INSTANCEMETHODS], [ISA], [ISINSTANCEOF], [ISNIL], [NEW], [OBJECTNAME], > [OBJECTNAME=], [REQUEST], [RUN], [SEND], [SENDWITH], [SETMETHOD], [START], > [STARTWITH], [STRING], [UNSETMETHOD], [\=], [\==], [||] > > ---> [The Comparable class]~instanceMethods([The Comparable class]), > arrOMeths~items: [0], methods: > > ---> [The Class class]~instanceMethods([The Class class]), arrOMeths~items: > [34], methods: > [<>], [=], [==], [><], [ACTIVATE], [ANNOTATION], [ANNOTATIONS], > [BASECLASS], [COPY], [DEFAULTNAME], [DEFINE], [DEFINEMETHODS], [DELETE], > [ENHANCED], [HASHCODE], [ID], [INHERIT], [ISABSTRACT], [ISMETACLASS], > [ISSUBCLASSOF], [METACLASS], [METHOD], [METHODS], [MIXINCLASS], [NEW], > [PACKAGE], [QUERYMIXINCLASS], [SUBCLASS], [SUBCLASSES], [SUPERCLASS], > [SUPERCLASSES], [UNINHERIT], [\=], [\==] > > *arrMeths~items: **84** sum: 84* > ------------------------------------------------------------------------------- > > allMeths, result of: [The String class]~instanceMethods:*allMeths~items: **66* > ===> allMeths:[], [ ], [<>], [<>], [=], [=], [==], [==], [><], [><], > [ACTIVATE], [ANNOTATION], [ANNOTATIONS], [BASECLASS], [CLASS], [COPY], > [COPY], [DEFAULTNAME], [DEFAULTNAME], [DEFINE], [DEFINEMETHODS], [DELETE], > [ENHANCED], [HASHCODE], [HASHCODE], [HASMETHOD], [ID], [IDENTITYHASH], > [INHERIT], [INIT], [INSTANCEMETHOD], [INSTANCEMETHODS], [ISA], [ISABSTRACT], > [ISINSTANCEOF], [ISMETACLASS], [ISNIL], [ISSUBCLASSOF], [METACLASS], > [METHOD], [METHODS], [MIXINCLASS], [NEW], [OBJECTNAME], [OBJECTNAME=], > [PACKAGE], [QUERYMIXINCLASS], [REQUEST], [RUN], [SEND], [SENDWITH], > [SETMETHOD], [START], [STARTWITH], [STRING], [SUBCLASS], [SUBCLASSES], > [SUPERCLASS], [SUPERCLASSES], [UNINHERIT], [UNSETMETHOD], [\=], [\=], [\==], > [\==], [||]*allMeths~items: **66* > > =============================================================================== > instanceMethods of [hello world]: > ============= > superclasses: [The Object class], [The Comparable class] > ============= > > ---> [hello world]~instanceMethods([The String class]), arrOMeths~items: > [117], methods: > [], [ ], [%], [&], [&&], [*], [**], [+], [-], [/], [//], [<], [<<], > [<<=], [<=], [<>], [=], [==], [>], [><], [>=], [>>], [>>=], [?], [ABBREV], > [ABS], [APPEND], [B2X], [BITAND], [BITOR], [BITXOR], [C2D], [C2X], > [CASELESSABBREV], [CASELESSCHANGESTR], [CASELESSCOMPARE], > [CASELESSCOMPARETO], [CASELESSCONTAINS], [CASELESSCONTAINSWORD], > [CASELESSCOUNTSTR], [CASELESSENDSWITH], [CASELESSEQUALS], [CASELESSLASTPOS], > [CASELESSMATCH], [CASELESSMATCHCHAR], [CASELESSPOS], [CASELESSSTARTSWITH], > [CASELESSWORDPOS], [CEILING], [CENTER], [CENTRE], [CHANGESTR], [COMPARE], > [COMPARETO], [CONTAINS], [CONTAINSWORD], [COPIES], [COUNTSTR], [D2C], [D2X], > [DATATYPE], [DECODEBASE64], [DELSTR], [DELWORD], [ENCODEBASE64], [ENDSWITH], > [EQUALS], [FLOOR], [FORMAT], [INSERT], [LASTPOS], [LEFT], [LENGTH], [LOWER], > [MAKEARRAY], [MAKESTRING], [MATCH], [MATCHCHAR], [MAX], [MIN], [MODULO], > [OVERLAY], [POS], [REPLACEAT], [REVERSE], [RIGHT], [ROUND], [SIGN], [SPACE], > [STARTSWITH], [STRIP], [SUBCHAR], [SUBSTR], [SUBWORD], [SUBWORDS], > [TRANSLATE], [TRUNC], [UPPER], [VERIFY], [WORD], [WORDINDEX], [WORDLENGTH], > [WORDPOS], [WORDS], [X2B], [X2C], [X2D], [[]], [\], [\<], [\<<], [\=], [\==], > [\>], [\>>], [|], [||] > > ---> [hello world]~instanceMethods([The Object class]), arrOMeths~items: > [32], methods: > [], [ ], [<>], [=], [==], [><], [CLASS], [COPY], [DEFAULTNAME], > [HASHCODE], [HASMETHOD], [IDENTITYHASH], [INIT], [INSTANCEMETHOD], > [INSTANCEMETHODS], [ISA], [ISINSTANCEOF], [ISNIL], [OBJECTNAME], > [OBJECTNAME=], [REQUEST], [RUN], [SEND], [SENDWITH], [SETMETHOD], [START], > [STARTWITH], [STRING], [UNSETMETHOD], [\=], [\==], [||] > > ---> [hello world]~instanceMethods([The Comparable class]), arrOMeths~items: > [1], methods: > [COMPARETO] > > > arrMeths~items: 150 sum: 150 > ------------------------------------------------------------------------------- > > allMeths, result of: [hello world]~instanceMethods: > allMeths~items: 150 > ===> allMeths:[], [], [ ], [ ], [%], [&], [&&], [*], [**], [+], [-], [/], > [//], [<], [<<], [<<=], [<=], [<>], [<>], [=], [=], [==], [==], [>], [><], > [><], [>=], [>>], [>>=], [?], [ABBREV], [ABS], [APPEND], [B2X], [BITAND], > [BITOR], [BITXOR], [C2D], [C2X], [CASELESSABBREV], [CASELESSCHANGESTR], > [CASELESSCOMPARE], [CASELESSCOMPARETO], [CASELESSCONTAINS], > [CASELESSCONTAINSWORD], [CASELESSCOUNTSTR], [CASELESSENDSWITH], > [CASELESSEQUALS], [CASELESSLASTPOS], [CASELESSMATCH], [CASELESSMATCHCHAR], > [CASELESSPOS], [CASELESSSTARTSWITH], [CASELESSWORDPOS], [CEILING], [CENTER], > [CENTRE], [CHANGESTR], [CLASS], [COMPARE], [COMPARETO], [COMPARETO], > [CONTAINS], [CONTAINSWORD], [COPIES], [COPY], [COUNTSTR], [D2C], [D2X], > [DATATYPE], [DECODEBASE64], [DEFAULTNAME], [DELSTR], [DELWORD], > [ENCODEBASE64], [ENDSWITH], [EQUALS], [FLOOR], [FORMAT], [HASHCODE], > [HASMETHOD], [IDENTITYHASH], [INIT], [INSERT], [INSTANCEMETHOD], > [INSTANCEMETHODS], [ISA], [ISINSTANCEOF], [ISNIL], [LASTPOS], [LEFT], > [LENGTH], [LOWER], [MAKEARRAY], [MAKESTRING], [MATCH], [MATCHCHAR], [MAX], > [MIN], [MODULO], [OBJECTNAME], [OBJECTNAME=], [OVERLAY], [POS], [REPLACEAT], > [REQUEST], [REVERSE], [RIGHT], [ROUND], [RUN], [SEND], [SENDWITH], > [SETMETHOD], [SIGN], [SPACE], [START], [STARTSWITH], [STARTWITH], [STRING], > [STRIP], [SUBCHAR], [SUBSTR], [SUBWORD], [SUBWORDS], [TRANSLATE], [TRUNC], > [UNSETMETHOD], [UPPER], [VERIFY], [WORD], [WORDINDEX], [WORDLENGTH], > [WORDPOS], [WORDS], [X2B], [X2C], [X2D], [[]], [\], [\<], [\<<], [\=], [\=], > [\==], [\==], [\>], [\>>], [|], [||], [||] > allMeths~items: 150 > > It seems that the instanceMethods message sent a class object does not > return all methods. E.g. the class methods of .String seem to be missing > from ".String~instanceMethods" (also NEW gets returned only once, which > caused yesterday's question). > > Looking at the results of sending instanceMethods to a string instance, > returns the expected methods (those defined in .String and those inherited > from the superclasses .object and .comparable). > > Is there an error if sending instanceMethods to class objects, or is there > an error in assumptions and/or the test code? > I'm not seeing anything that appears to be missing from .String~instancemethods, so I'm not seeing any problem here. There is certainly one error in your assumptions. You are assuming that any class object will automatically have all of the methods of .Class, but other class objects do not directly inherit from .Class, but are instances created by .Class (or rather the metaclass, which is .Class in most cases). That new class object does not automatically get all of the methods of the metaclass, for example, the NEW methods. In that state, it is barely usable. The full scope of the instance methods is then built up by adding in the inheritance hierarchy. So, if you are manually trying to construct things yourself, you would do this by adding the instance methods from each superclass, ending with adding in .Object~instancemethods(.Class). Rick > ---rony > > > _______________________________________________ > Oorexx-devel mailing list > Oorexx-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/oorexx-devel >
_______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel