NAME

Syntax::Keyword::PhaserExpression - phasers as arbitrary expressions rather than blocks

SYNOPSIS

use Syntax::Keyword::PhaserExpression;

if( BEGIN $ENV{DEBUG} ) {
   printf STDERR "Here's a debugging message> %s\n", gen_debug();
}

DESCRIPTION

This module provides a syntax plugin that alters the behaviour of perl's BEGIN keyword. This allows hoisting an expression to be evaluated at compile-time, and replace its result into the compiled code. This may be useful for performance, to avoid otherwise-expensive calls whose value won't change, or to inline constants for other performance-related benefits.

There may also be situations where it is useful to have expressions evaluated early enough in compiletime so that their effects can influence the compilation of later code.

KEYWORDS

BEGIN

BEGIN expr...

An expression prefixed with the BEGIN keyword is evaluated as soon as it is compiled. The scalar result is then captured and inlined, as a constant, into the surrounding code.

As the expression is not a full block, it does not create a surrounding scope that hides lexical variables inside it. This can be useful for assigning a value to a variable at compiletime so that later compiletime expressions can see its value.

BEGIN my $arg = "the value";
use Some::Module arg => $arg;

Note that the expression may not start with an open brace ({) character, as that is used by regular Perl's BEGIN block. This module does not replace that syntax.

TODO

  • Implement some other phaser keywords. CHECK and INIT might be useful. Not END for obvious reasons. ;)

AUTHOR

Paul Evans <leonerd@leonerd.org.uk>