Fortress is Sun's project at making a next-generation computer language.
I like its technical report very, very much:

    http://research.sun.com/projects/plrg/fortress0618.pdf
    (via http://lambda-the-ultimate.org/node/view/673 )

Syntax aside (eg. their `=` and `:=` has the reverse meaning
in Perl 6), so far everything I'm seeing in it has a very close
correspondence to Perl 6, most notably the roles/traits system, use of
unicode symbols (see Appendix C for a cute way to transcribe unicode
programs in ASCII), and its creator's desire to make a language
optimized for evolvability.  Oh, and it has return type MMD. ;-)

There are a few things in that spec, though, that makes me wonder
if Perl 6 should have it too:

-----------------------------------------------------------------

1. Type variables as role parameters

Fortress's List type is as this:

    trait List [T]
        first(): T
        rest(): List [T]
        cons(x: T): List [T]
        append(xs: List[T]): List [T]
    end

Curiously, A12 and S12 already allows something like that:

    role List[Type $t] {
        method first() returns ::($t);
        method rest() returns List[::($t)];
        method cons(::($t) $x) returns List[::($t)];
        method append(List[::($t)] $xs) returns List[::($t)];
    }

But I am not at all sure if this is the correct notation --
specifically, the "Type" type is not explained, and I'm not sure
how they are instantiated during the type checking phase at the
compile time.  Furthermore, I'm not sure that the ::($t) notation
is correct above.

-----------------------------------------------------------------

2. Tuple types

    sub foo () returns (Int, Bool, Array) {

Currently per S09, Perl 6 collection types all have uniform types,
so one has to use the `List of Any` or `Array of Any` return type
instead.  That seriously hinders inference and typechecking; however,
I wonder if it is a design decision already made... :)

-----------------------------------------------------------------

3. Labels applies to blocks, not statements

Instead of this:

    LABEL:
        say "Hello!"
        say "Hi!"

One has to write this (essentially creating named blocks):

    LABEL: {
        say "Hello!"
        say "Hi!"
    }

It makes sense because labels are frequently only used for block
control; the only thing that requires them at the statement level
is goto(), and you can still goto(LABEL) if you really want to.

-----------------------------------------------------------------

4. Software Transaction Memory

Like GHC Haskell, Fortress introduces the `atomic` operator that takes a
block, and ensures that any code running inside the block, in a
concurrent setting, must happen transactionally -- i.e. if some
precondition is modified by another thread before this block runs
completely, then it is rolled back and tried again.  This slides covers
some aspects of STM as used in GHC:

    http://homepages.inf.ed.ac.uk/wadler/linksetaps/slides/peyton-jones.ppt

In Fortress, there is also an `atomic` trait for functions, that
declares the entire function as atomic.

I mention this, instead of the more powerful automatic parallelization 
features, because STM can be retrofitted on any VM with boxed storage
types, while parallelization is a much harder problem that may not be
in Parrot's interest to tackle.

-----------------------------------------------------------------

5. Macro model based on syntax expanders.

See section 3.4, "Support for Domain-specific Languages" in the
technical report.  For example, it allows:

    syntax sql exp end escape ~ = parseSQL(exp)

Which defines, in Perl 6 terms, a `macro prefix:<sql>` that allows
the ~ symbol as an escape clause:

    sub find_things (Field $thing) {
        sql {
            SELECT description FROM
                SELECT ~$thing FROM things
        }
    }

The thing here is that all syntax error and type error is detected at
compile time, unlike the usual qq{} solution.

-----------------------------------------------------------------

6. Database-indexed module management

An embedded database (such as SQLite) can be used to track different
revisions of installed modules on the local machine, manage upgrades,
check api compatibility, and keep related logs; see Chapter 4 for
details.  I have long wanted something like that for CPANPLUS, instead
of the current, limited, nonversioned, unrevertable, partial information
provided by .packlist files.

-----------------------------------------------------------------

7. AST definition

Appendix A has "A Description of Fortress Abstract Syntax in Fortress
Concrete Syntax", which lays out the SyntaxTree class and all traits and
objects it may contain with Perl 6 concrete definitions.  I think this
will complement nicely with the Rule-based Perl 6 grammar file, as the
grammar itself does not neccessary contain AST information it generates.

Is there something like it that exists somewhere for Perl 6?

Thanks,
/Autrijus/

Attachment: pgpyE30YFFWQT.pgp
Description: PGP signature

Reply via email to