Slash Boxes
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

autrijus (1505)

  (email not shown publicly)

Journal of autrijus (1505)

Friday June 24, 2005
09:17 PM

Day 141: Hackathon day #2: More revelations

[ #25351 ]
(to be continued...)
(and no, Perl 6 was too much fun so that we didn't tackle the ICFP contest in the end. sadly.)
  • Roles are also classes! They can be instantiated just fine if they are concrete enough. Basically they mean composable classes or mixin-able classes. Hence, instantiates an object that will probably fail on all stubs.
  • Class-defined methods with the same short name as their roles must conform to the same signature as the role methods; otherwise a fatal exception occurs.
  • Abstract pure methods in Roles really just return an Exception object, exactly the same way as if the ... is evaluated normally.

    method foo () { ... }

  • Perl 6 is defined with separate compilation in mind; each compilation unit is going to pretend they are compiled in a different process. They are allowed to bind names (exports) in other namespaces, but they cannot read anything from others.
  • &chomp and &wrap are now nondestructive; chomp returns the chomped part, which can be defined by the filehandle that obtains the default string at the first place. To get destructive behaviour, use the .= form.
  • Filehandles opens chomped by default; you need to add the :newlines flag to turn off chumping.

    my $fh = open 'file';                   # autochomp
    my $fh = open 'file', :newlines;        # non-autochomp
    $fh.newline = "\r";                     # now split on \r
    $str = $fh.readline;
    $str.newline;                           # \r

    for chomp =$fh { ... }

    If .newline is set to a rule, then its captured variables are made available to the calling block as if it has done a matching.

  • The chained associativity level is associative with the precendence level it is in; hence, in the same level all chainfix operators glue together the same way the chained comparisons glue together. The listfix associativity always accept one trailing operator, so 1 Y 2 Y 3 Y is legal.
  • Rules have their grammatical category, &rule:<foo>, that can reside in either grammars, non-grammar packages, or the true global namespace where they get names like &*rule:<ident>. Inside grammars they are called &Foo::rule:<blah>.
  • Grammar is a specialized form of Role (which is a special form of Class, which is a special form of Package). When a grammar does another grammar, it mixes in the grammar's rules as package globals.
  • To invoke an unqualified subrule, look at the lexical scope of the invocation site, then package globals, then finally global builtins. This is exactly the same order as a normal subroutine lookup. One can think rules as submethods that gets mixed in with a does call. You call them with the current invocant (i.e. the Grammar):

    # calling <ident>
    &rule:<ident>.($?SELF: $state);

  • To invoke a qualified subrule, one look the package-level named rule up, then invoke it with two parameters: The invocant is the package object that subrule belongs to; the argument is the state object the rule engine is currently treading upon:

    # calling <Grammar::ident>
    &Grammar::rule:<ident>($Grammar: $state);

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
More | Login | Reply
Loading... please wait.