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

Reply via email to