Greetings,

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

This release marks a milestone for Muldis D in that the /language specification/
is now fundamentally complete, with all of the important details now formally
specified.  Prior to this milestone, some important details were missing, and so
it would have been difficult to demonstrate what actual Muldis D code looks
like, whereas now it is feasible to write and understand code for any given
task.  Some code examples follow.

However, no Muldis D implementation actually exists yet, so you can't actually
/run/ any code.  The next Muldis D milestone will be the creation of a
substantially complete self-contained reference implementation, which I expect
to have done sometime in the next few months.  Until that next milestone is
reached, the Muldis D language spec is officially of pre-alpha quality; as of
that milestone, it will officially be alpha quality.

Here is the specification:

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

For those of you who are not familiar, Muldis D is an industrial-strength
computationally complete high-level programming language with fully integrated
database functionality; you can use it to define, query, and update
"object-relational" databases.  The language's paradigm is a mixture of
declarative, homoiconic, functional, imperative, and object-oriented.

The syntax of Muldis D is like that of a general purpose programming language,
with Perl 6 being a strong influence (and multiple other
languages contributing too), but it also greatly
resembles SQL as well, and so shouldn't be too difficult to learn.

For all intents and purposes you can consider Muldis D to be what SQL should
have been; it can express anything useful that SQL can, but in a much improved
manner.  So it should be easier to write more expressive and less kludgy code in
Muldis D than in SQL.  The simple code comparisons further below should
demonstrate this.

In order to get a more thorough introduction to Muldis D, please go to:

  http://muldis.com/Muldis_D.html

This document gives some side-by-side code comparisons with SQL, ideas for what
you can use Muldis D for /right now/ (in existing database tools), a list of its
features, and more.

See http://search.cpan.org/dist/Muldis-D-Manual/lib/Muldis/D/Manual/CD.pod for a
complete database schema plus test application example.

Browse through
http://search.cpan.org/dist/Muldis-D/lib/Muldis/D/Dialect/PTMD_STD.pod for the
concrete grammar plus a lot more code examples.

Here's the canonical way in Muldis D to do a common kind of query that searches
simply using value equality tests:

  $tab1 matching Relation:{
    col1 => 'hello', col2 => 5,
    col1 => 'world', col2 => 7
  }

... and here are 2 ways to do the same query in SQL:

  SELECT *
  FROM tab1
  WHERE (col1, col2) IN (
    SELECT 'hello' AS col1, 5 AS col2
    UNION
    SELECT 'world' AS col1, 7 AS col2
  )

  SELECT *
  FROM tab1
  WHERE col1 = 'hello' AND col2 = 5
     OR col1 = 'world' AND col2 = 7

Given the example relvar/table "tab" that has the 8 attributes/columns
(col1,col2,col3,bigcol4,col5,col6,col7,col8), here's how you select all but one
in Muldis D:

  $...@{!bigcol4}

... and in SQL:

  SELECT col1, col2, col3, col5, col6, col7, col8
  FROM tab

Here's the canonical Muldis D for a summary per named attributes giving the 
count:

  $peo...@{#@count_per_age_ctry <- !age,ctry}

... and the SQL:

  SELECT age, ctry, COUNT(*) AS count_per_age_ctry
  FROM people
  GROUP BY age, ctry

These are equivalent:

  'x'

... versus:

  (SELECT 'x')

  (SELECT 'x' FROM dual)

... and:

  $tab1

... versus:

  SELECT * FROM tab1

This code in an atomic statement will swap the values of 2 variables:

  $x := $y
  $y := $x

Here's an example of an atomic stored procedure that performs and returns the
result of a query; it uses a higher-order function:

    recipe count_heads (&$count : NNInt, $search : Text,
            $people ::= $fed.data.db1.people) {
        with value-filter filt (Bool <-- $topic : Tuple, $search : Text) {
            $.name like ('%' ~ $search ~ '%')
        }
        $count := r# ($people where <nlx.lib.filt>( $>search ))
    }

Here's an atomic stored procedure example that demonstrates self-recursion:

    updater make_coprime (&$a : NNInt, &$b : NNInt) {
        with function gcd (NNInt <-- $a : NNInt, $b : NNInt) {
            $b = 0 ?? $a !! rtn( a => $b, b => $a mod $b round Down )
        }
        $gcd ::= nlx.lib.gcd( $>a, $>b )
        $a := $a div $gcd round Down
        $b := $b div $gcd round Down
    }

See also http://mm.darrenduncan.net/mailman/listinfo for the 3 official public
email lists that are specific to Muldis D and its implementations: "-announce",
"-devel", and "-users"; just the latter 2 are for discussions.

If you want a "homepage" url to link to, you can use http://www.muldis.com/
concerning this project or particularly its commercial support.

And http://github.com/muldis/ is its main public GIT version control repository.

Thank you in advance for any interest in or support for this project that you
can give.  Any kind of support is welcome, from trying to update your own
projects to use Muldis D, or from contributing your time and expertise to
improving Muldis D or its implementations or ancillary projects, or promoting
this project in various media and forums.  Support is welcome in providing
significant financial sponsorship towards my further work, in which case you
have more of a say in its direction and priorities.  But mainly I want to see it
get used to enrich projects and their users and developers.

This project and ancillary projects are a serious endeavor that I intend to
commercially support over the long term, and others can do likewise.

Good day. -- Darren Duncan


Reply via email to