While going to bed, I realized that I totally forgot that the override-related options should be at the .Package class object level (just used package instances for faster development). So the current variant has two methods defined for the .Package class:

 * a class method named "options" that allows querying and setting the options
   "OverridePackageSettings" and "CountOverride", and

 * an instance method named "options" that allows querying and setting the 
options for the package
   instance in hand, i.e., the options "All", "Digits", "Error", "FAilure", "FOrm", 
"FUzz",
   "Lostdigits", "NOString", "NOTready", "Prolog", and "Trace" (these are all 
the options one can
   set with the ::options directive).

Yesterday's "launch.rex" sample, therefore, needs to be changed to:

   parse arg pgmName args -- parse program name and command line arguments -- 
override the options
   of programs that get called or required from now on .package~options("Override", 
"::OPTIONS ALL
   SYNTAX") -- set override settings .package~options("countOverride", -1) -- 
override all
   called/required program/package settings -- now call the program with the 
overridden options
   call (pgmName) args -- run the program

(Note: this "launch.rex" version will "globally" apply the overrides as the "countOverride" option got set to a negative number, i.e., to "-1".)

Usage of "launch.rex" remains the same, i.e.,

   G:\test\orx\options>*rexx launch.rex test_novalue.rex*
         1 *-* say "using a variable with" novalue "which is by default fine!"
         6 *-* call (pgmName) args    -- run the program
   Error 98 running G:\test\orx\options\test_novalue.rex line 1:  Execution 
error.
   Error 98.986:  Reference to unassigned variable "NOVALUE".
   G:\test\orx\options>

Will now start testing and once if it looks stable enough, will commit this version such that everyone interested may get their hands on it after the interpreters are re-created by Jenkins and placed on < <https://sourceforge.net/projects/oorexx/files/oorexx/5.2.0beta/>.

---rony


On 14.10.2025 22:16, Rony G. Flatscher wrote:

Hi Jon,

Sorry for being "mum"; however, I have been trying to get the second part implemented and up and running the way I intended (but did not know whether I would succeed). For a few minutes, it has been working; it still needs thorough testing and tidying up before I would be ready to submit the code.

Here are the coarse specifications:

  * There is a new option named "OverridePackageSettings" (default: 
packageSettings default),
    which returns the current overridePackageSettings as an ::OPTIONS directive 
string, or if a
    second argument is supplied, it needs to be a string representing a 
syntactically correct 
    ::OPTIONS directive which then gets used to set the override 
packageSettings from then on;
    this can be changed at runtime dynamically at any time repeatedly

  * There is a new option named "CountOverride" (default: 0), which returns the 
current
    "countOverride", and if a second argument is supplied, it needs to be a 
number with the
    following implications (can be changed at anytime repeatedly):

      o 0 ... no overriding takes place (default setting)

      o +n (positive number): overriding takes place exactly n times and then 
halts

      o -1 ... overriding takes place constantly (in previous discussion meant for 
"global
        override") and can only be stopped by setting the value explitly to 0
        (.context~package~options("count",0))

This will allow at runtime to turn on package settings override dynamically 
(e.g. for debugging).

This should e.g. allow for a little Rexx launcher, that would allow Walter et.al. to invoke any program with something like "::options all syntax" or "::options digits 20" to override all program option settings intentionally ("launch.rex"):

    parse arg pgmName args -- parse program name and command line arguments -- 
override the
    options of programs that get called or required from now on pkg = 
.context~package -- get
    package object pkg~options("Override", "::OPTIONS ALL SYNTAX") -- set 
override settings
    pkg~options("count", 1) -- just override settings once for the next 
called/required program --
    now call the program with the overridden options call (pgmName) args -- run 
the program

Here a program that would run as long as the novalue condition is not set 
("test_novalue.rex"):

    say "using a variable with" novalue "which is by default fine!"

Running the "test_novalue.rex" program as is with its output:

    G:\test\orx\options>*rexx test_novalue.rex*
    using a variable with NOVALUE which is by default fine!
    G:\test\orx\options>

Running "test_novalue.rex" with "launch.rex" above would look like this and generate the following output:

    G:\test\orx\options>*rexx launch.rex test_novalue.rex*
          1 *-* say "using a variable with" novalue "which is by default fine!"
          8 *-* call (pgmName) args    -- run the program
    Error 98 running G:\test\orx\options\test_novalue.rex line 1:  Execution 
error.
    Error 98.986:  Reference to unassigned variable "NOVALUE".
    G:\test\orx\options>

If the "count" option was set to "-1" then all subsequently called or required programs would get their package options overridden as well.

---

The third part (TBD, maybe Gil can lend a hand there, which would be really of great help) would then be to implement the ability for the discussed switches for the rexx launchers (rexx[.exe], rexxhide[.exe], rexxpaws[.exe]):

    options ::= (-o | --override | -g | --global-override) ("string" | 
@<filespec>)

Ad "string": this must be formatted as a single, syntactically correct "::OPTIONS" directive, without a semi-colon (;), carriage return (CR, "0d"x) or linefeed (LF, "0a"x) to be seen acceptable.

---

After testing further and tidying up I would also try to reword the documentation, trying to avoid the problems that Jon has thankfully pointed out, with the request to give feedback or improvements for it, once done!

---rony



On 13.10.2025 16:57, Sahananda wrote:
Hi Rony,

It is really tricky expressing things clearly and it seems to me that this sentence describes something that can be used several ways and thus is really complicated.  I'm now not sure whether the verb should be Set, Modify or Override, and if I have understood you correctly, then until we see the behaviour of the finished object this will remain unclear, and it may be that even at method invocation time, we don't know whether the operation being performed is a set, a modify or an override as that is dependant on what follows and whether new programs or packages inherit these options.

To me, this is the flavour of the three words

  * SET - This assigns a value to the option, either an initial one or a 
replacement one.  The
    value can subsequently changed by setting again
  * MODIFY - This assigns a new value replacing an extant value.  The value can 
subsequently be
    changed by modifying again
  * OVERRIDE - This is assigning a new value whilst remembering the old (or 
perhaps original)
    value.  The OVERRIDE can be undone somehow and either the previous or 
original value will be
    reinstated.  I'm not clear whether this is a push/pop.

None of them seem to exactly describe the mechanism that you describe (turning 
off the override)

I wonder if anyone else can take a stab at it?

Jon


On Mon, 13 Oct 2025 at 14:09, Rony G. Flatscher <[email protected]> wrote:

    Hi Jon,

    On 13.10.2025 14:07, Sahananda wrote:
    Sorry, there was a typo.  In my suggested sentence, the first 'set' is 
redundant as what is
    being set is called the 'package options', not the 'set package options'.

    The first part of the sentence should therefore read:

    *This method retrieves the current package options,*

    I have difficulty with the rest of the sentence as I am not sure what you 
are saying. 
    Perhaps it would be better as two sentences:

    *This method retrieves and optionally sets the current package options.  
The package options
    may also be set explicitly using the ::options directive.*

    I'm not sure whether the word 'modifies' should replace the word 'sets'?  
If (and I think
    this is the case) there will always in every circumstance be a previous 
value to the package
    options when this method is called, I think '*modifies*' is better here.  
If there is some
    circumstance where this method can be used to initialise the package 
options (and I don't
    think that is possible) then imho '*sets*' would be clearer.

    Again, I'm still not sure how the adverb '*explicitly*' modifies the 
meaning in this
    context.  Perhaps if you said a couple of sentences about that I could 
venture an opinion.

    Again,  I hope this is helpful,

    Yes, very much so, and thank you very much for taking the time!

    Maybe a few more infos after reading your thoughts: this 'options' method 
without argument
    returns a string formatted as an ::OPTIONS directive showing all options in 
effect for the
    package. In addition it allows to query and set any option that can be 
listed on the
    ::OPTIONS directive, whereby always the value at method invocation time 
gets returned.

    However, this method is also meant for allowing for defining the package 
settings that should
    be used to override the package settings when loading programs/packages 
which then determine
    the package settings that should be in effect. To make this even more 
flexible there is an
    idea of turning on/off the overriding behaviour not only with a switch, but 
even allowing to
    optionally define the number of overrides that should take place, including 
"infinity". This
    is still in infant stage, but eventually this should become available 
(currently implementing
    that part).

    Not sure whether that clarifies it, as it is work in progress (WIP) and 
cannot be tested yet.
    (Once that part works one could use that infrastructure then to allow for 
supplying override
    options when starting a Rexx program.)

    HTH

    ---rony

_______________________________________________
Oorexx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to