Hi there,
while experimenting with a class (JSON_Boolean) that inherits the class
"Orderable" and implements
the abstract method "compareTo" and a "makestring" method to yield "0" for
.false and "1" for .true,
I have run into a problem that may be obvious to others, but currently I am
stuck: it seems that
relational comparisons only cause the "compareTo"-method to be invoked, if both
operands are
instances of .JSON_Boolean!
So far I thought that a relational comparison like "(a=b)" would cause a
message like "(a~'='(b))"
to be carried out by the interpreter which in the case of inheriting from
"Orderable" would
ultimately cause the "compareTo"-method of "a" to be invoked in its "=" method
supplying "b" as the
argument "other".
Therefore I would expect that the "compareTo"-method gets invoked via
"Orderable" if the left hand
side of the comparison is an object of type .JSON_Boolean. However, this is not
the case!
Here is a small snippet of a program and the values the comparisons generate
going as line comments
in the appropriate statements:
vtrue =.json_boolean~new(.true) say "vtrue=1:" (vtrue=1) -- yields: 0
(vtrue~compareTo() NOT
invoked! expecting to yield 1 !) say "1=vtrue:" (1=vtrue) -- yields: 1
(invoked
vtrue~makeString()) say "vtrue=vtrue:" (vtrue=vtrue) -- yields: 1
(vtrue~compareTo() got
invoked) ... cut ...
What surprises me is that the expression "(vtrue=1)" does not cause a message
like "vtrue~'='(1)" to
be carried out which then would carry out a message like "vtrue~compareTo(1)"
in Orderable's "=" method!
If both operands are of type JSON_Boolean, then - and only then - is
JSON_Boolean's
"compareTo"-method triggered.
The (shortened) program used for these tests is enclosed, followed by the
output running it on
ooRexx 4.2.0 and ooRexx 5.0.0alpha.
Maybe I am overlooking something obvious, hence asking whether my assumptions
are correct and if
not, what the exact rules are?
---rony
P.S.: Test program and the output of running the program on 32-bit ooRexx 4.2.0
and 5.0.0alpha.
"test.rex":
parse version v say "***" v "***" vtrue =.json_boolean~new(.true) say
"vtrue ="vtrue say "---"
-- as JSON_Boolean inherits Orderable and implements a compareTo-method,
shouldn't that be
invoked? say "vtrue=1:" */(vtrue=1)/* say "1=vtrue:" */(1=vtrue)/* say
"---" say "vtrue=vtrue:"
/*(vtrue=vtrue*//*)*/ *::class "JSON_Boolean" public inherit /orderable/*
::attribute value get
-- getter method ::attribute value set -- setter method, accpeting ooRexx
logical values in a
relaxed, JSON related form expose value use strict arg val -- test whether
a value was supplied
that we accept as a boolean value, i.e. one of "0", "1" or -- one of a
caseless "true", ".true",
"false" or ".false" if "0 1 true false .true .false"~caselessWordPos(val)=0
then raise syntax
88.900 array ("Argument must be one of '0', 'false', '.false', '1', 'true'
or '.true', found:"
val) value=("0 false .false"~caselessWordPos(val)=0) -- .true, if no false
values supplied
::method init use strict arg val self~value=val -- determine and assign
boolean value using the
defined attribute setter method */::method compareTo/* -- implementation
for .orderable class:
must return -1 if other greater, 0 if same, 1 otherwise expose value use
strict arg other --
other must be a Boolean value .traceOutput~say("//"
self~objectname"@"self~identityHash"::compareTo()
other~objectname="other~objectName) if
other~isA(.JSON_Boolean) then otherValue=other~value else
otherValue=other~request("string") --
request the string value if otherValue=.nil then raise syntax 88.900 array
("Argument other
["other"] has no 'MAKESTRING' method") .traceOutput~say("\\"
self~objectname"@"self~identityHash"::compareTo() otherValue="otherValue
"self~value:" value) if
otherValue > value then return -1 if otherValue = value then return 0
return 1 */::method
makestring/* -- allow instances of this class to be plug in replacement for
ooRexx logical
values expose value
.traceOutput~say(self~objectname"@"self~identityHash"::MAKEstring,
value="value) return value
Output of running "test.rex" on ooRexx 4.2.0:
G:\test\oorexx\json>rexx test.rex *** */REXX-ooRexx_4.2.0(MT)_32-bit 6.04
22 Feb 2014/* *** a
JSON_Boolean@264727158::MAKEstring, value=1 vtrue =1 --- vtrue=1: 0 a
JSON_Boolean@264727158::MAKEstring, value=1 1=vtrue: 1 --- // a
JSON_Boolean@264727158::compareTo() other~objectname=a JSON_Boolean \\ a
JSON_Boolean@264727158::compareTo() otherValue=1 self~value: 1 vtrue=vtrue:
1
Output of running "test.rex" on the latest ooRexx 5.0.0:
F:\download\Rexx\ooRexx\alpha500\work\bin_small>rexx
g:\test\oorexx\json\test.rex ***
*/REXX-ooRexx_5.0.0(MT)_32-bit 6.05 14 Jun 2016/* *** a
JSON_Boolean@-2109450313::MAKEstring,
value=1 vtrue =1 --- vtrue=1: 0 a JSON_Boolean@-2109450313::MAKEstring,
value=1 1=vtrue: 1 ---
// a JSON_Boolean@-2109450313::compareTo() other~objectname=a JSON_Boolean
\\ a
JSON_Boolean@-2109450313::compareTo() otherValue=1 self~value: 1
vtrue=vtrue: 1
------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are
consuming the most bandwidth. Provides multi-vendor support for NetFlow,
J-Flow, sFlow and other flows. Make informed decisions using capacity planning
reports.http://sdm.link/zohodev2dev
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel