On 2023-01-07 07:02:33 Rony G. Flatscher wrote: > On 07.01.2023 00:00, J Leslie Turriff wrote: > > On 2023-01-03 04:25:33 Rony G. Flatscher wrote: > >> Thanks to everyone for the comments, information and ideas. Enclosed > >> please find the next iteration of that little script. Invoking it with > >> "getOoRexxDocs.rex ?" yields the refurbished (hopefully clearer) usage > >> text: > >> > >> getOoRexxDocs.rex [directory [needle]] > >> > >> a utility to download the ooRexx documentation > >> from SourceForge and save them in a subdirectory "docs.V" of the current > >> directory where "V" is the specified version (e.g. "5.0.0") > >> > >> no argument ... download all files from the directory > >> carrying the highest version number > >> > >> ? or -h ... show this usage information > >> > >> directory ... the SourceForge documentation directory to > >> download from, usually named after the ooRexx version (e.g. "4.2.0", > >> "5.0.0", "5.1.0beta") > >> > >> needle ... only downloads files from the SourceForge > >> directory which contain the (caseless) needle in their names (e.g. > >> "-html.zip", ".pdf", "ref") > >> > >> N.B.: This program uses "curl" on all platforms. You can find more > >> information on the Internet or<https://curl.se> > >> and<https://en.wikipedia.org/wiki/CURL>. > > > > [snip] > > > >> Any feedback, ideas? > >> > >> ---rony > > > > I'm curious as to where you obtained the shortcut .resources syntax used > > in the usage handler in this program? It is simply > > > > | say .resources~usage > > > > but the Language Reference only shows > > > > | say .resources[name]~makeString > > > > which is harder to remember. > > There are a few things here to know: > > * ooRexx is influenced by Smalltalk quite a bit and incorporates the > message paradigm of which Alan Kay (https://de.wikipedia.org/wiki/Alan_Kay, > German, but cites Alan Kay in English near the top from > https://en.wikipedia.org/wiki/Alan_Kay) says: "I'm sorry that I long ago > coined the term "objects" for this topic because it gets many people to > focus on the lesser idea. The big idea is "messaging". In ooRexx there is > an explicit message operator, the tilde (~), left of which is the receiver > and right of it the name of the message. > > o In principle, if a programmer wishes that a method routine gets > executed he has to send the value (a.k.a. "object", "instance") a message > by the name of the desired method routine; the receiving object (a.k.a. > "value", "instance") conceptually then looks up the inventory of method > routines in its class (a.k.a. "type", "structure") and invokes it on behalf > of the programmer and returns any result the method routine may produce (ff > the message carries arguments they get used when the receiving object > invokes the method routine). > > o If the receiver cannot find a method routine named after the > message, it will look-up its super class and look there and if not found in > its superclass and so forth until the root class (named "Object") has been > sought. If no matching method routine is found, then a runtime error gets > created with the message "97.1 Object xyz does not understand message mno" > and the program gets stopped. > > However, there is an "unknown" mechanism built-into ooRexx: before > raising the syntax error 97.1 a search for a method routine named "unknown" > is excercised as above. Should such a method routine be available then the > receiver will invoke it instead and supply two arguments, the name of the > message in uppercase and an array that contains the arguments, if any, > supplied with the message. > > In the case of resource directives ooRexx creates a collection (of > type StringTable which is like the ooRexx Directory) named "RESOURCES" and > saves it in the package's (package is a normal Rexx program that usually > happens to have directives) environment directory and can then be > referenced by its environment symbol (an environment symbol always starts > with a dot) '.RESOURCES' . ooRexx then saves each resource directive there > using as the index the name (in uppercase) and the contained lines as an > array. In the program the name of the resource is "usage", hence one can > fetch that entry from .resources with ".resources['USAGE']". > > Now, the StringTable (like the Directory) class have an unknown > method routine defined (cf. rexxref.pdf, "5.3.17.22. unknown", "5.3.9.23. > unknown") for them. This unknown method will use the received unknown > message name as the index and look-up itself using that value. So if one > sends ".resources~usage" the StringTable unknown method routine will get > "USAGE" and use that to look up the StringTable and return the stored array > (for more information look up the reference manual). > > * REXX is a string based language, such that everything is a string. > ooRexx in order to remain backwardly compatible (becoming able to execute > REXX programs as well) makes sure that REXX BIFs (built-in-functions) and > REXX keyword statements like SAY or PARSE get strings to work with, even if > they get values supplied that are not strings like is the case with a value > of type Array. So what happens in this case is that the SAY keyword > instruction requests a string value from the array value/object/instance > and gets it magically. ;) Actually, there is no magic involved in this, one > just needs to know one more thing in this context: each > class/type/structure in ooRexx possesses a method routine named "STRING" > (this method routine is defined in the root class named "Object", cf. > rexxref.pdf, "5.1.4.25. string") which will return a string value (usually > that string value contains the name of the class/type/structure the > value/object/instance got created from). If however there is in addition a > method named "MAKESTRING" available, then that is executed which is the > case for Array collections (cf. rexxref.pdf, "5.3.6.24. makeArray"). > > You may want to look up rexxref.pdf, "4.2.11. Required String Values". > > HTH, > > ---rony
Okay, I see now. I wonder, though, if relying on method UNKNOWN as a shortcut might be a bit dangerous, if the underlying code gets changed sometime in the future? Leslie -- Platform: GNU/Linux Hardware: x86_64 Distribution: openSUSE Leap 15.4 Open Object Rexx: 5.0.0 r12286 Build date: Aug 12 2021 _______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel