Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

Pugs 6.2.13 released!

by audreyt (Hermit)
on Oct 17, 2006 at 14:35 UTC ( #578791=perlnews: print w/replies, xml ) Need Help??

After nearly four months of development and 3400+ commits, I'm very glad to announce that Pugs 6.2.13 is now available:
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!

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 &$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


  • 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
  • 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


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


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


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


  • Converted 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


  • 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



  • See the SYN links on 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


  • 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 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


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


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


  • A web teminal for running an interactive Pugs shell on the web
  • WebTerminal: a library for building web terminals for interactive shells
  • See for a live demo






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

Perl 6 on Perl 5


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


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

Experimental projects


  • 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


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


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

Replies are listed 'Best First'.
Re: Pugs 6.2.13 released!
by zentara (Archbishop) on Oct 19, 2006 at 15:36 UTC
    In case any of you are wondering if it builds, it does!! I just built it with the binary ghc, ghc-6.6-i386-unknown-linux.tar.bz2, parrot-0.4.6, and the prerequisite modules...
    # from the install file v6-pugs needs the CPAN modules Devel::Caller, Module::Compile and Pugs::Compiler::Rule. The first one is dependent on Module::Build with C_support, so install ExtUtils::CBuilder and ExtUtils::ParseXS first. Satisfy all with one command: + $ sudo cpan -fi ExtUtils::CBuilder ExtUtils::ParseXS Module::Build \ + Devel::Caller Module::Compile Pugs::Compiler::Rule

    It took a half hour to build, on my 2ghz system, and /usr/bin/pugs was over 10.2 megs stripped. It looks like they are on the way. :-)

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlnews [id://578791]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2018-03-18 19:57 GMT
Find Nodes?
    Voting Booth?
    When I think of a mole I think of:

    Results (230 votes). Check out past polls.