Pugs 6.2.13 released!

audreyt on 2006-10-17T13:32:34

After nearly four months of development and 3400+ commits, I'm very glad to announce that Pugs 6.2.13 is now available:

http://pugs.blogs.com/dist/Perl6-Pugs-6.2.13.tar.gz
SIZE: 6839270
SHA1: b06b8434c64e9bb5e3ab482282fbae0a6ba69218

Motivated by increasing use of Pugs in production, this is an extra release in the 6.2.x series, offering another 200%+ improvement in performance, comprehensive support for interoperability with Perl 5 modules, a built-in grammar engine via native perl5 embedding, and much better support for roles, classes and objects.

The web-based presence of Pugs and Perl 6 has improved as well:

Thanks again to all lambdacamels on #perl6 for building this new ship together; it is truly an exhilarating voyage. :-)

Have -Ofun!
Audrey

Changes for 6.2.13 (r14402) - October 17, 2006

Build System

  • Perl 5 embedding is now enabled by default
    • For Windows users, Perl 5.8.x is required
    • Set the PUGS_EMBED environment variable to noperl5 to disable this
  • Prompting for Parrot embedding is now disabled by default
    • Set the PUGS_EMBED environment variable to parrot to enable this
  • Support for compiling using GHC 6.6
    • GHC 6.4.1+ is still supported, but 6.6 will be required in the next release

Feature Changes

Interactive Shell and Command-Line Flags

  • New pugs -d flag to display a trace for debugging
  • The :r command now resets the environment once, not twice
  • The return value of blocks, such as gather {...}, is displayed correctly
  • $_ is no longer clobbered with the result of each expression's evaluation

Perl 5 Interoperability

  • Arrays and Hashes now round-trip from Pugs to Perl 5 land and back
  • Importing functions from Perl 5: use perl5:CGI <header param>
  • Passing unboxed values across runtimes no longer leaks memory
  • When embedding Perl 5.8+, Unicode flag is now on for Pugs-to-Perl5 strings
  • eval($str, :lang<perl5>) now accepts non-ASCII characters in $str

Lexical Syntax

  • Capture literals: \($bar: 1, 2, 3, named => 4)
  • Here-docs now work as specced; also warns against inconsistent indentation
  • Interpolation of chained calls: "$foo.meth.meth.meth.meth()"
  • List comprehension: for 0 < list(@x) < 10 {...}
  • Named character escapes: "\c[LATIN CAPITAL LETTER Y]"
  • New grammatical category term:, separated from the prefix: category
  • New magical variables: $?COMPILER and $?VERSION
  • Parse for LABEL: STMT, although it's currently treated the same as STMT
  • Pod directives: =begin/=end and =for now terminate without =cut
  • Pod variables: $=FOO and @=FOO give you access to the Pod section FOO
  • Quote adverbs no longer take non-parens brackets: rx:P5{...} is valid again
  • Shell-like quoting rules implemented for << $x "qq" 'q' >>
  • Signature literals: :($foo is copy = 42, $, @)
  • Support for UTF-8, UTF-16 and UTF-32 encoded source files
  • Support for backquotes and qx/.../ for capturing external command output
  • User-defined infix associativity: sub infix:<foo> is assoc('right') {...}
  • "\123" and "\03" are now errors; write "\d123" and "\o03" instead
  • $::x now means exactly the same a $x, instead of $*x
  • %h<> now means %h{} -- the entire hash, not the empty string as key
  • ($::('x')) with two adjacent closing parens now parses correctly
  • 0_123_456 now parses as 0d123456, not an error
  • 1<2> is now a fatal error: Odd number of elements in Hash
  • q() and qw() with parentheses are parsed as functions, not quotes

Declarators and Operators

  • Argument interpolation via prefix | and |<<
  • Binding to qualified uninitialised symbols: &fully::qualify := sub {...}
  • Contextual variables are now declared with my $x is context, not env $x
  • Hyperised reduce operators: [>>+<<] and [\>>+<<]
  • Implicit invocation assignment: .= uc is parsed as $_ = $_.uc
  • Mid-block redeclaration no longer allowed: my $x; { $x = 1; my $x = 2 }
  • Negated comparison operators: !eqv, !=:= etc; !~~ replaces !~
  • New infix comparison operators: === and eqv
  • New infix non-short-circuiting boolean AND operator: ?&
  • Nullary reduction of builtin operators gives identity values: [*]() === 1
  • Postfix operators can be called with a dot: .++, $x.++, $x.\ ++
  • Prefix = now iterates on arrays as well: =@array
  • Short-circuiting chained comparison: 1 > 2 > die('foo') no longer fails
  • Smart matching against code objects: $obj ~~ { 1 > $_ > 5 }
  • Smart matching against implicit invocation: $obj ~~ .meth, $obj ~~ .[0]
  • Typed constraints on autovivification: my Hash $x; $x[0] = 1 now fails
  • Typed declarations: my Dog $fido, my T ($x, $y)
  • * is now always a term, never a prefix operator

Blocks and Statements

  • Implicit invocation in when: when .true {...} , when .<key> {...}
  • Listops in conditions no longer consume the block: for say {...}
  • Loop topics are not forced into rw: for 1..3 { $_++ } now fails correctly
  • New &break and &continue primitives for use within when blocks
  • New &leave primitive for exiting from the innermost block
  • New postfix given statement modifier: .say given foo()
  • Support for FIRST, NEXT, LAST loop control blocks
  • Support for START, PRE, POST, KEEP, UNDO, ENTER, LEAVE blocks
  • Support for repeat blocks: repeat {...} while 1, repeat while 1 {...}
  • Support for the &each list interleaver: for each(@a; @b) -> $x, $y {...}
  • The for loop no longer double-flattens lists: for %h.pairs -> $p {...}
  • Topicalisers for if, else, while, given blocks: if EXPR -> $x {...}
  • Topicalisers for postfix for loop: -> $x {...} for 1,2,3
  • &last and &redo now work in repeat {...} and loop {...} blocks
  • &take no longer flattens array literals: take [1,2,3];
  • &take now works in functions called from within a gather {...} block
  • BEGIN(...), END(...), etc., are now parsed as calls, not syntax errors
  • END {...} in .pm files are no longer ignored when executed directly
  • INIT {...} now works correctly inside eval "..."
  • do {...} is now a loop block that takes standard loop controls
  • do {...} with statement modifiers is explicitly disallowed

Regexes and Grammars

  • Anonymous tokens and rules anchor on both ends: 123 ~~ token{2} is false
  • New s[...] = EXPR and s[...] = .meth syntax; s[...][...] is deprecated
  • New tr/// syntax for transliteration; y/// will not be supported
  • Pugs::Compiler::Rule (PCR) replaces Parrot/PGE as the default engine
  • Support for :c/:continue, <prior>, and much more: see PCR's ChangeLog
  • $(), @() and %() parse correctly as $$/, @$/ and %$/
  • /.../ matches $_ under Int, Num and void context in addition to Bool
  • m:g/(1)|(2)/ now returns only successfully matched subcaptures

Modules and Routines

  • Allow space-separated adverbial named arguments: f( :x<foo> :$y :!z )
  • Multi-dispatching now handles named, slurpy and optional arguments
  • Multi-dispatching now handles parenthesized expressions as arguments
  • Named arguments with no matching parameters is now an error
  • New &c.call($capture) method to call without a caller frame (similar to Perl 5's goto &sub, but it returns)
  • New &c.signature method to get a Signature object from a Code object
  • Parse for the proto routine modifier: proto method foo ($x) {...}
  • Precompiled .pm.yml files with mismatching AST version will no longer load
  • Support for user-defined unary and optional-unary prefix macros
  • The main package is now ::Main, not ::main
  • &?CALLER_CONTINUATION is now fully reentrant
  • &yield in coroutines works correctly within loop blocks
  • sub ($x = 0 is copy) no longer allowed; say sub ($x is copy = 0) instead
  • sub f ($x is lazy) {...} no longer evaluates $x more than once
  • sub f (@x?) {...}; f() now sets @x to [], not [undef]

Classes and Objects

  • Attribute-like method call syntax: @.method(1), $.method: 2, 3, 4
  • Class attributes: class C { my $.x is rw }
  • Class name literals are now term macros, not prefix functions
  • Compile-time self-mixin no longer allowed: role A does A
  • Default initialiser expression for attributes: class C { has $.x = 123 }
  • Dot attributes are now method calls: @.x is the same as @(self.x)
  • Dynamic method calls: $obj.$meth
  • Hyperised method calls: $obj.>>meth
  • Quantified method calls: $obj.*meth, $obj.+meth and $obj.?meth
  • Reopening classes: class C is also {...}
  • Role mixins: role R {...} class C does R {...}
  • $?SELF is gone; write self instead
  • BUILDALL/DESTROYALL trigger once per class even with diamond inheritance
  • does R and is C statements in class body now evaluate in compile time

Built-in Primitives

  • New &HOW, &WHAT and &WHICH functions replace &meta, &ref and &id
  • New &VAR macro to force lvalue evaluation of an expression
  • New &comb function, a dual to &split but matches the wanted parts
  • New &crypt function to create one-way digest strings
  • New &fork function to create a new process
  • New &printf function for formatted printing
  • New &quotemeta function for escaping strings
  • Support for %b in formatted printing
  • The &system function no longer dies when the command does not exist
  • The .as method is renamed to .fmt for formatted printing
  • The .perl method now returns Unicode strings

Bundled Modules

New modules

ext/CGI/

  • A new as_yaml method to dump CGI parameters as YAML
  • Allow initializing the CGI object with a hash of parameters
  • New Dump function adapted from Perl 5's CGI.pm
  • New basic tests for escapeHTML and unescapeHTML, which were broken
  • New tests for PATH_INFO
  • Only send the Content-Type: header if we actually have a content-type
  • Only send the Status: header if it's a redirect, or if it's explicitly added
  • Refactored into an OO-only module. N.B.: this breaks backwards compatibility!
  • Some work on charset handling, though a charset method is still missing
  • The content_type method is renamed to type for compatibility
  • The cookies attribute is renamed to cookie for compatibility

ext/HTTP-Server-Simple/

  • The old non-standard ./method syntax has been replaced with self.method

ext/Rosetta/

  • Significant updates to the lib/Rosetta/SeeAlso.pod documentation

ext/Set-Relation/

  • Renamed from ext/Relation/
  • Beginning of separate Set::Tuple and Set::Relation classes

ext/Test/

  • Converted Test.pm documentation from Kwid to Pod syntax
  • The eval_ok and eval_is functions are gone; use is eval instead, which runs its string in the current lexical scope rather than in Test's (which is usually what you want)

Test Suite

util/prove6

  • Can now run only a portion of the test suite, or even a single file
  • Original shell script rewritten in Perl 5 for improved portability
  • Support for multiple Pugs backends and multiple Perl 6 implementations

util/smartlinks.pl

util/smokeserv/

  • See the SYN links on http://smoke.pugscode.org/ for this in action
  • Smoke client now uploads raw .yml results as well as .html
  • The smokeserver now annotates the spec with test results using smartlinks

t/

  • All tests now begin with use v6-alpha; instead of use v6;
  • Many, many more smartlinks have been added into the spec
  • Programs and modules in examples/ are tested for syntactic correctness
  • Tests in t_disabled/ are merged back into the main test suite
  • t/02-test-pm/ created to ensure that Test.pm works as advertised
  • t/blocks/ renamed from t/subroutines/
  • t/closure_traits/ created to test closure traits (FIRST, LAST, etc.)
  • #!/usr/bin/pugs is gone from all test files
  • eval_ok and eval_is are now ok eval and is eval, so that eval'd strings will be run in the current lexical scope

Examples and Utilities

examples/

       
  • All Perl 5 programs have been renamed from *.p5 to *-p5.pl
  •    
  • All Perl 6 programs have been renamed from *.p6 to *.pl
  • All references to them, except in talks, have been likewise updated

examples/games/dispatch_quiz.pl

  • A game to test your knowledge about Perl 6's multi-dispatch system

misc/runpugs/

  • A web teminal for running an interactive Pugs shell on the web
  • WebTerminal: a library for building web terminals for interactive shells
  • See http://run.pugscode.org/ for a live demo

Documentation

docs/Perl6/Perl5/Differences.pod

docs/Perl6/Spec/

docs/Pugs/Doc/

docs/talks/extraction.xul

  • Slides from Nathan Gray's Practical Extraction with Perl 6 talk

Perl 6 on Perl 5

perl5/Pugs-Compiler-Perl6/

  • The v6.pm implementation of Perl 6 now handles ./pugs -CPerl5 commands
  • See its own ChangeLog for more information

v6/

  • A new subproject to write a Perl 6 compiler in Perl 6
  • Bootstrapped from the v6.pm compiler on the perl5 runtime
  • See its own ChangeLog for more information

Experimental projects

misc/pX/Common/P5_to_P6_Translation/

  • Converts Perl 5.9.4+'s YAML syntax tree into Perl 6
  • Handles regexes, arrays, hashes and many builtin functions
  • See its own documentation for more information

misc/pX/Common/convert_regexp_to_six.pl

  • Converts Perl 5 regex into Perl 6
  • See its own documentation for more information

misc/pX/Common/redsix/

  • An Perl 6 implementation on Ruby 1.9+
  • See its own documentation for more information