develooper Front page | perl.perl6.language | Postings from July 2005

Re: Elimination of Item|Pair and Any|Junction

Thread Previous | Thread Next
From:
=?ISO-8859-1?Q?=22TSa_=28Thomas_Sandla=DF=29=22?=
Date:
July 27, 2005 09:28
Subject:
Re: Elimination of Item|Pair and Any|Junction
Message ID:
42E7B626.8030304@orthogon.com
HaloO,

Larry Wall wrote:
> Yes.  The only thing I don't like about it is that any() isn't an Any.
> Maybe we should rename Any to Atom.  Then maybe swap Item with Atom,
> since in colloquial English you can say "that pair of people are
> an item."

Since we are in type hierachies these days, here's my from ::Any
towards ::All version. The "bottom" part where everything finds
together is missing for this installment.

                  ::Any
...............     |     ..........................
        _______:_____|_____:________    static type :
       |       :     |     :  |     |     = context :
    Package    :     |     : Void  Bool             :
       |       :     |     :.........................
     Module    :     |
    ___|___    :     |
   |       |   :     |
Class Grammar :     |
   |_______|   :     |
       |       :     |
      Role     :   Object
               :     |____________________________
               :     |         |        |         |
               :   &Code     @Array   %Hash     $Item
               :     |         /        /         |
   with        :     |       Tuple    Record      |
   invocant(s) :     |                            |
           ____:____/ \______   __________________|_________________
          |    :  |     |    \ /          |    |     |      |       |
       .Method : Sub  Block   |           |   Inf  Undef  Match  Junction
         /|    :  |\          |           |
        / |    :  | \        Ref[Code]    |
    Rule  |    :  |  Macro                |
          |____:_/|            __________/|\____
          |    :  |           |     |     |     |
        Multi  :  |         ~Str  +Num  \Ref  :Pair
..............:  |           |     |     |\    |
                  |           |    Int    | \   |
      ___________/|           | ____|____ |  Entry[::T where T.does(Hash)]
     |     |      |           |/    |    \|
   *List  Pipe =Iterator     Enum ?Bit  Pos[::T where T.does(Str|Array)]
     |\___________
     |      |     |
  **Eager  Lazy  Ref[Array|Hash]


any() == lub( all ---> any ) == glb( any --> all )   lesser --> greater
all() == glb( all ---> any ) == lub( any --> all )

Some operators and prefixes are added in to show their
relation to the corresponding type. I hope it looks familiar.

Here is some pseudo code that describes a bare minimum data layout
required to support the respective types.

type Item[::T]
{
   has $.value of T;
}

type Pair[::T]
{
   has $.key;
   has $.value of T;
}

type Tuple[::T where T does lub( @.values )]  # lub = least upper bound
{
   has @.values of T;
   has $.value ::= @.values; # auto-enreference for Item subtyping
   has T $.head ::= @.values[0];
   has T $.tail ::= @.values[-1];
}

type Record[::T where T does lub( @.values )]
{
   has @.keys;
   has @.values of Pair[T];
   has @.pairs ::= { zip @.keys, @.values };
   has $.value ::= @.pairs;
}

type Code
{
   has %.MY;    # lexical scratchpad
   has &.block;
   has $.value ::= { use %.MY; &.block() }; # coderef literal
}

type Junction[::T where enum <any all one none>]
{
   has @.values;
   has Junction $.value ::= { @.values as Junction[T] };
   has &.evaluate ::= &::JUNCTION_MAGIC; # what's the exact type of this?
}
-- 
$TSa.greeting := "HaloO"; # mind the echo!

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About