In order to systematically try to implement this feature, I would suggest implementing the method "options" for Package first and then analyzing whether everything works as expected. If that works out, the next step would be to define the specs for the environment variable and command line switches (this includes whether, and if so, how to define options/fileContent that should be used for the initial program/package, or globally from that moment on for all programs/packages that get loaded).

So here is a suggestion for the description of the suggested OPTIONS method for 
the Package class:

   OPTIONS( [optionName [, newValue]])

   Returns a directory with the values of all currently set options for the 
package. If the
   optional argument "optionName" is supplied, it returns the current setting. 
If the optional
   argument "newValue" is supplied for "optionName", then "newValue" replaces 
the current value for
   the package.

   "optionName" can be one of (only the first signifcant letters need to be 
supplied as argument,
   depicted in uppercase):

         * Digits
           returns the current number of digits (default: 9)

         * FOrm
           returns "ENGINEERING" or "SCIENTIFIC" (default: "SCIENTIFIC")

         * FUzz
           returns the current number of FUZZ digits (default: 0)

         * Handlecondition (default: "ERROR CONDITION FAILURE CONDITION 
LOSTDIGITS CONDITION
           NOSTRING CONDITION NOTREADY CONDITION NOVALUE CONDITION")
           returns a string denoting how conditions get handled

         * Prolog (default: "PROLOG")
           returns "PROLOG" or "NOPROLOG"

         * Trace (default: "NORMAL")
           returns "NORMAL | ALL | COMMANDS | ERROR | FAILURE | INTERMEDIATES | 
LABELS | OFF | RESULTS"

   Changing "optionName" to "newValue" (only the first significant letters need 
to be supplied as
   argument, depicted in uppercase)

         * Digits, nrDigits
           nrDigits>0

         * FOrm, "Engineering" | "Scientific"

         * FUzz, nrDigigs
           nrDigits>=0

         * Handlecondition, (All | Error | Failure | Lostdigits | NOString | 
NOTReady | NOValue 
           "Condition" | "Syntax")+
           Note 1: using ALL will set ERROR, FAILURE, LOSTDIGITS, NOSTRING, 
NOTREADY, NOVALUE to
           "CONDITION" | "SYNTAX"
           Note 2: it is possible to have multiple definitions such that one 
could use ALL for the
           default handling, and define specific handling options for ERROR, 
FAILURE, LOSTDIGITS,
           NOSTRING, NOTREADY, NOVALUE if need be; in case of conflict, the 
last definition prevails
           Note 3: the settings of the conditions HALT, NOMETHOD, SYNTAX, and 
USE cannot be changed

         * Prolog, "Prolog" | "Noprolog"

         * Trace, Normal | All | Commands | Error | Failure | Intermediates | 
Labels | Off | Results

How about protecting this method such that a security manager can be used to protect access to this method, if need be?

Are there any stumbling blocks, side effects one needs to be aware of?

Any thoughts, comments, ideas?

---rony


On 02.10.2025 14:36, Josep Maria Blasco wrote:

Missatge de Rony G. Flatscher <[email protected]> del dia dj., 2 d’oct. 
2025 a les 13:59:

    Thanks to everyone who gave feedback and hinted at being able to help 
(kudos to Gil)!

    Before going further, we should first agree on the specifications:

      * ad environment variable's name: REXX_OPTIONS; if it has a value, it may 
denote anything
        one can denote with the ::options directive on a single line

      * ad command line arguments: not yet clear which ones are needed and what 
their name should
        be; there are suggestions for "-o" for options (suggesting alias "--options") and 
"-go"
        for global options (suggestion alias "--global-options");  it is 
followed by a blank and a
        quoted string that may denote anything one can denote with the 
::options directive on a
        single line. Should we allow options to be stored in a file, and a) if 
so, what option
        should be used for indicating that the options are defined in a file, 
and b) what should
        the content of the file be (even if it is a properties file, what keys 
should be defined,
        what values are allowed)

Maybe "-fo" or "--file-options"? And also, maybe the keys should be the same as the option names below, to avoid confusions.

     *


      * ad runtime inspection and setting: how about allowing a method 
"options" on the package
        class with the following arguments:
          o no argument: return a StringTable with the package's (program's) 
options
          o a single argument: the argument denotes the name of an option for 
which the package's
            value should be returned
          o two arguments: the first argument denotes an option, the second 
argument denotes the
            option's value

    Here are suggestions for the option names:

      * DIGITS (number)
      * FORM (Engineering | Scientific)
      * FUZZ (number)
      * HANDLE_CONDITION subkeywords: ALL, ERROR, FAILURE, LOSTDIGITS, 
NOSTRING, NOTREADY, NOVALUE
        (Condition | Signal )

I would try not to use names with underscores, if at all possible (no, I don't have a good candidate). And it's "Syntax", not "Signal" :)

  Josep Maria

      * PROLOG (.true | .false) ... .false means NOPROLOG, makes sense only if 
one can define this
        before loading a program/package
      * TRACE subkeyword (All | Intermediates | Normal | Off | Results)

    Any comments, ideas?

    ---rony


    On 01.10.2025 12:55, Josep Maria Blasco wrote:
    Maybe the global case could also be handled at the command line level.

    For example, assuming that
      rexx -o "options" program

    would pass options "options" to "program" and to "program" alone,

      rexx -go "options" program

    (""go" for "global options") would pass options "options" to "program", and
    to all the packages required by "program" or loaded via loadPackage.

     Josep Maria


    Missatge de Rony G. Flatscher <[email protected]> del dia dc., 1 
d’oct. 2025 a les 12:07:

        On 30.09.2025 19:57, Gilbert Barmwater via Oorexx-devel wrote:

        Having had some time to think about this, I have the following proposed 
design for
        discussion.

        1) I very much like the idea of an environment variable - I would call 
it REXX_OPTIONS
        to be consistent with the other one, REXX_PATH.  This has the advantage 
of allowing a
        one-time setting, if desired, and removal of the need to type the value 
for every
        execution of a program with the possibility of mis-typing it.  I would 
propose that the
        entire "line" to be appended be specified in rexx_options, i.e. 
'::options all syntax'
        for example.  This would then allow addition of a ::requires directive 
instead should
        one need to "add" multiple lines to the end of the target program. (The 
multiple lines
        would be placed in a separate file and the ::requires would name that 
file.)

        2) Specifying a switch ( /O or -O ) on the rexx command gives the user 
control on every
        execution if the "line" is to be added (or not).  I would not consider 
it an error if
        the "O" switch was specified but rexx_path was undefined; this would be 
equivalent to
        execution without the "O" switch.

        One might argue that this design requires a two step process as 
compared to specifying
        "everything" on the command which is a single step.  While true, I 
believe the potential
        usage for this feature would be multiple executions of the command with 
the same
        "options" so being able to specify those "options" once would be 
beneficial.

        I do not think the implementation should be too difficult (I have 
experience adding a
        switch to rexx.exe) with the more challenging part being locating and 
getting the target
        program source into a buffer where the "line" can be appended.  The 
buffer would then be
        executed by RexxStart just as is done when the "E" switch is present 
with a program string.

        It would be possible to "blindly" append an ::options statement to the 
end as ::option
        directives can be given multiple times and the last one wins. This is 
done by
        tracetool.rex (cf. net-oo-rexx package) which appends an ::option 
statement to denote the
        desired global trace option for creating a tracelog.

        There is one case where this is not possible: if a program is compiled 
with rexxc one
        cannot tamper with the source code as it is not available.

        ---

        AFAICT the options are registered against the package which can be used 
to query all set
        options. What is missing there are (protected) setters which would 
allow for changing the
        initial settings at runtime which sometimes would be more than helpful 
as the case of
        Walter shows. Studying the fundamental Package class one could use 
importedPackages to
        analyze (and if made possible) and to change the global options 
settings there as well,
        if one wrote such an ooRexx program (e.g. processing all available 
packages in the prolog
        and setting the options there).

        So a question in this context would be whether it was o.k. to add 
setters to the
        package's option attributes "digits", "form", "fuzz", "trace"? And add some 
"condition"
        method to set/reset the condition related settings (like "all syntax" or 
"all
        condition"), if that is possible to have immediate effect at runtime.

        ---

        If one wishes to set the options to be used for programs that are to be 
required/called,
        all of the options (including "prolog" or "noprolog") should become 
settable. Maybe
        having a runtime "options" object in addition that defines the defaults 
for
        loading/requiring programs could be used, such that the defaults for 
loading new programs
        could be changed by changing such a default "options" object?

        ---rony


        On 9/29/2025 8:02 AM, Rony G. Flatscher wrote:

        One more idea: as ooRexx starts out with predefined options values (like 
"digits 9",
        "trace normal", ...) which currently can be changed statically per 
program/package by
        adding ::options statements, it should be possible to define those 
"predefined options"
        at startup. E.g., something like (borrowing from Regina)

          * rexx someRexxProgram -o "options string" somePgm args ... somePgm 
and each program
            executed will get its options changed to "options string"
          * rexx someRexxProgram --options="options string" somePgm args ... 
somePgm and each
            program executed will get its options changed to "options string"
          * rexx someRexxProgram -op somePgmWithOptionsSet.cls somePgm args ... 
somePgm and
            each program executed will get its options changed to all ::OPTIONS 
in
            "somePgmWithOptionsSet.cls"

        or an environment variable like OOREXX_OPTIONS, where each program 
executed will get
        its options changed to OOREXX_OPTIONS.

        This would allow Walter's requirement to be easily applied without the 
need to change
        any program, something like 'rexx -o "ALL SYNTAX" somePgm [args]'

        ---rony


        On 28.09.2025 21:46, Rony G. Flatscher wrote:
        On 28.09.2025 15:04, Hobart Spitz wrote:

        IMHO, yes.  It keeps with the philosophy of general flexibility and 
"letting the
        programmer do what they want when they want" even if we can't think of 
a reason right
        now.

        Thank you for your feedback, Hobart!

        Any other thoughts?

        ---rony


        OREXXMan
        Q: What do you call the residence of the ungulate with the largest 
antlers?
        A: A moose pad.
        :-D
        Would you rather pass data in move mode (*nix piping) or locate mode 
(Pipes) or via
        disk (JCL)?  Why do you think you rarely see *nix commands with more 
than a dozen
        filters, while Pipelines specifications are commonly over 100s of 
stages, and 1000s
        of stages are not uncommon.
        REXX is the new C.

        On Sun, Sep 28, 2025, 05:49 Rony G. Flatscher <[email protected]> 
wrote:

            ooRexx being a dynamic language usually allows for defining, e.g. 
classes
            statically with
            directives, but also dynamically at runtime instantiating .class 
(and creating
            and assigning methods
            and the like).

            The ::options directive has become quite powerful and it would be 
helpful to be
            able to a) query all
            package's current settings and b) allowing to change the (::options 
related)
            package settings at
            runtime ("dynamic"). (Maybe a proper Options class may be helpful 
which allows
            for interrogating and
            setting options.)

            This may help in situations like using (maybe older) Rexx programs 
for which some
            settings should be
            changed (like "any syntax", but also "trace ..." comes to mind, 
etc.).

            Would that be seen as a desired improvement?

            ---rony

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

Reply via email to