On Tue, Dec 18, 2018 at 4:14 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at>
wrote:

> 2) seems the most flexible/powerful one.
>
> Constants can be regarded as special attributes that can be accessed in
> the class object and in each of its instances. Currently their value is a
> symbol.
>
> As you are envisioning some sort of a method execution to determine the
> constant value, how about allowing a method body (like an attribute setter
> method without an argument) to define the constant value?
>
> Something like:
>
> ::constant aconstant foo -- like now
>
> ::constant fullsize            -- new: no value supplied, just the name
>    expose fullsize
>    fullsize=2**12
>
> ::constant halfsize            -- new: no value supplied, just the name
>    expose halfsize fullsize
>    halfsize=fullsize/2
>
> ::constant x_halfsize_x        -- new: no value supplied, just the name
>    expose x_halfsize_x
>    x_halfsize_x= self~x_fullsize_x/2   -- employ "self"
>
> ::constant x_fullsize_x 4096  -- like now
>
> ::constant abc                -- new: no method body use name as value, hence 
> will use "abc" as its constant value
>
> Absolutely not. If you want something like this, then code a real method
or attribute. This is just going to be a single directive statement with an
expression. The expressions have no access to instance variables, but can
call methods, functions, etc. as needed.

Rick



> ---rony
>
>
>
> On 17.12.2018 23:41, Rick McGuire wrote:
>
> I admit this is a feature I've wanted for some time but was not sure how
> to actually do it. Since Erich opened the feature request, I thought I
> should give it a closer look. I've gotten far enough into this that I
> believe it can be done, with some restrictions. There are a few items where
> decisions need to be made on which direction to proceed.
>
> So, basically this will work by building a special method that runs on the
> class object during the package install process. Each class directive will
> have its own special method and the instructions executed will be any
> ::constant directive that has a non-constant expression value. There should
> be no restrictions on the expressions and the variables SELF and SUPER will
> have the expected values for a method run on a class object. The
> expressions when run will be traceable if ::options trace is used, even
> interactive trace. I've got most of the mechanisms on how to do all of this
> worked out and it looks pretty clean.
>
> My first thought was to apply the current rules for parsing ::CONSTANT and
> anything that fell outside of the current rules would be a constant. This
> works, but there is a gotcha. The current rules allow constants to be
> defined using
>
> ::constant aconstant foo
>
> where foo is a symbol treated as a constant. Going this route means
>
> ::constant aconstant self
> ::constant anotherConstant (self)
>
> would produce different results. The parsing code could consider
> non-constant symbols to be expressions, which would cause these to have the
> same values, and most ::constant declarations would be unaffected because
> the variable would be uninitialized, and thus have the same values...with
> the exception of the variables SELF and SUPER, which will have a value.
> There's also the issue of ::options novalue error, which will suddenly
> start getting tripped by instructions that were fine before.
>
> Right now, I'm leaning toward an explicit syntax to indicate the value
> needs to be computed at class creation time. We already have a precedent of
> using parens to indicate a general expression, so I believe we should use
> that. No parens, old rule, in parens, an expression to be evaluated.
>
> Part of the processing I envision is the constant methods are created
> initially, but are "incomplete" and if they are invoked before they are
> "completed", they will raise a new subcode of error 97 to indicate the
> constant had not been initialized. Initialization occurs in declaration
> order, so constants can refer to other constants of the same class, as long
> as they were declared prior to the usage. That is
>
> ::constant fullsize (2**12)
> ::constant halfsize (self~fullsize/2)
>
> Would work, but
>
> ::constant halfsize (self~fullsize/2)
> ::constant fullsize (2**12)
>
> would give an error evaluating self~fullsize. Directives with true
> constant values will be available always, so
>
> ::constant halfsize (self~fullsize/2)
> ::constant fullsize 4096
>
> would work because fullsize method was complete at parse time.
>
> The next issue I'm wrestling with is when to perform the calculation. The
> current package installation code does things in two passes. During
> parsing, the classes are analyzed for inheritance dependencies and the
> classes are created so that classes that are required by other classes are
> created first, so these are not done in top-down declaration order.
>
> Once all of the class objects have been created, a second pass is done to
> call the activate() methods on the new class objects.
>
> The dynamic constants (looking for a better name for these...) introduce a
> third stage to this processing. I see three approaches that can be used:
>
> 1) Completing the constants is part of the class creation, so it is done
> for each class in turn. This will limit somewhat the ability to refer
> classes defined within the same package.
> 2) Perform a complete pass through the class objects initializing the
> constants. This allows some capability to reference other classes and all
> of the constants are completed before any of the activate() methods are
> invoked.
> 3) Perform the constant initialization at the same time activate() is
> called on the class. Again, this limits the ability of class activate()
> methods to use the constants defined by another class.
>
> Right now, I'm leaning toward 2), because it means the classes are all
> fully initialized as class objects before any of the activate() methods are
> calls.
>
> Those are the biggest issues I see here. I've got enough code roughed out
> to believe this can work, but I have quite a bit more to go.
>
> Rick
> 2) Completing
>
>
> _______________________________________________
> 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