Greetings,

I am pleased to announce that version 0.137.0 of the specification of the Muldis
D language, for object-relational databases, has been released on CPAN.

  http://search.cpan.org/dist/Muldis-D/

Between this release and release 0.136.0 (not separately announced), there have
been the following main improvements since release 0.135.0:

0.  In general, these releases feature a cleanup/consolidation of the operators
for testing the membership of values in collections, or of tuples in relations,
and a simplification of the basic order-comparison ops.  They also feature
improvements to the handling of comments and whitespace, and the addition of bag
function syntaxes.

1.  Updated each of the 11 basic order-comparison functions
"is_[before|after][|_or_same]", "min", "max", "minmax",
"Interval.[has|value_is]_[|not_]member" to remove its optional "func" parameter;
so now each of the 11 just has 2 or N mandatory inputs, and the declared type of
those is now "Ordered" rather than "Universal".  These 11 functions now
unconditionally wrap the virtual "sys.std.Core.Ordered.order" function rather
than wrapping an order-determination function given as an argument (or said
virtual by default).  This change results in a simplification for 99% of likely
use cases; for the remaining 1% which the 11 funcs have dropped support for,
users can write their own equivalents of the 11 easily enough.  Also updated the
concrete grammar and examples of the infix special syntax of the above 11
functions to reflect their just being plain dyadic or commutative infix ops
without optional parts now, and likewise consolidated their definitions.

2.  Renamed all 10 variants of all 4 dyadic infix operators for testing the
membership of a generic tuple in a generic relation.  With the 4 Unicode
variants, replaced any "r" with "@"; with the 6 ASCII variants, renamed any
"*in-r" to "*inside" and any "r-*has" to "*holds".  For examples,
"Relation.has_member" is now spelled "holds" or "@∋" rather than "r-has" or
"r∋", and "tuple_is_member" is "inside" or "∈@", not "in-r" or "∈r".

3.  In Types.pod, added new mixin type "Collective" that is intended to be
explicitly composed by other types that are effectively simple homogeneous
collections of values, and something more specific than relations in general.
Also updated the 5 types "Set", "Array", "Bag", "[S|M]PInterval" to compose
"Collective".

4.  Added new initially empty file lib/Muldis/D/Core/Collective.pod, with an
initial complement of 4 new virtual functions "[has|value_is]_[|not_]member".
Then in each of [Set.pod, Bag.pod, Interval.pod], updated the 4 same-named
functions so that they explicitly implement the same-named new virtuals.  In
Interval.pod, added 4 more functions, MPInterval analogies to the existing 4
SPInterval ones.  In Array.pod, added 2 related functions.  And so now each of
the 4 new virtual functions is implemented by 5 type-specific functions.

5.  In PTMD_STD.pod et al, for each of the 4 functions
"[has|value_is]_[|not_]member", merged the triples of set|bag|interval-specific
spellings of its dyadic infix syntax into a single spelling that works for all 3
types; the dyadic infix syntax will now invoke the 4 virtual funcs rather than
their 12 implementers.  For example, we used to have "in-s","in-b","in-i" and
now we have "in"; or, we used to have "s∌","b∌","i∌" and now we have "∌".

6.  Renamed the prefix operator for set/array/relation cardinality to "#" from 
"r#".

7.  Added function invocation alternate syntax expressions for 13 "Bag"
functions.  For the 12 of these that have the same unqualified names as
"Relation" (Set) funcs, the former use the latter's alternate syntax but with a
"+" suffix.  These 12 are "cardinality" (#+), "union" (∪+), "intersection" (∩+),
"diff" (∖+) and the 8 sub/superset operators.  The 13th Bag func is "union_sum"
(∪++).  The existing ops aren't overloaded because Bag isa subtype of Relation.

8.  In PTMD_STD.pod, updated the semantics of parsing string literals having
literal non-SPACE whitespace chars so that they are more flexible or DWIMmy.
Previously, non-SPACE whitespace was disallowed from appearing literally in
strings except as a "splitter" token, where it was delimited by a backslash pair
which told the parser to ignore/strip said whitespace.  Now, any characters are
allowed literally in strings and all non-SPACE whitespace is automatically
either ignored/stripped or substituted for SPACEs by the parser.  To actually
select such whitespace as part of the string, it now has to be encoded as an
escape sequence such as "\n".  And so, now it is easier to write block-size
strings or comments as one no longer needs some kind of delim per each line, not
even a backslash/splitter.  Now non-SPACE whitespace plus adjoining runs of
spaces are now replaced with a single space, or if escaped ws precedes said
literal ws, then the ws+space runs are just stripped instead.  The new behaviour
should make the selected string values invariant with both the code's linebreak
chars and with the code's indenting style, while saving useful formatting.

9.  In PTMD_STD.pod, reformatted non-value-comment literals so that they are now
delimited by both backticks and number signs, the former nested in the latter,
rather than just number signs; for example " #`This is a non-value comment.`# ";
the as-value-comment literals have not changed; for example " `This is an
as-value comment.` ".  The first consequence of this is that the standalone
number sign can now be more easily freed up to be used for things other than
comments, including by itself as an operator.  The second consequence of this is
that all comments are now delimited by backticks, rather than some just by
backticks and others just by num signs.  Also more comments changes.

10.  In PTMD_STD.pod, updated the grammar to explicitly include support for
embedding non-value comments anywhere that whitespace may appear that is outside
of a scalar value lit; the "<ws>" token now includes them.  Previously, the
non-value comments were defined but not actually invoked anywhere by the main
grammar.  Details subject to be refined.

11.  In PTMD_STD.pod, updated all the simple monadic prefix operators that are
symbolic (all but 'not') so that whitespace between each operator and its
argument is now optional.  So, for examples, you can now say "!is_foo" or
"#people" or "%relvar" and not have to be "# people"/etc.  This change is a
stopgap measure and later a more generic solution should be found for making
whitespace optional around operators.

And so, this release addresses the last of the most glaring TODO items, which is
consolidating the syntax for testing the membership of values in collections, or
of tuples in relations.  Prior to this fix was a situation almost as awkward as
needing separate math op syntax for integers and rationals.  And so, I have now
defined and used all of the system-defined mixin types that I anticipated for
the short term:  Ordered, Ordinal, Numeric, Stringy, Attributive, Collective,
Instant, Duration.

Good day. -- Darren Duncan


_______________________________________________
muldis-db-users mailing list
muldis-db-users@mm.darrenduncan.net
http://mm.darrenduncan.net/mailman/listinfo/muldis-db-users

Reply via email to