The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

PerlX::Let - Syntactic sugar for lexical state constants

VERSION

version v0.2.7

SYNOPSIS

  use PerlX::Let;

  let $x = 1,
      $y = "string" {

      if ( ($a->($y} - $x) > ($b->{$y} + $x) )
      {
        something( $y, $x );
      }

  }

DESCRIPTION

This module allows you to define lexical constants using a new let keyword, for example, code such as

  if (defined $arg{username}) {
    $row->update( { username => $arg{username} );
  }

is liable to typos. You could simplify it with

  let $key = "username" {

      if (defined $arg{$key}) {
          $row->update( { $key => $arg{$key} );
      }

  }

This is roughly equivalent to using

  use Const::Fast ();

  {
      use feature 'state';

      state $key = "username";

      unless (state $_flag = 0) {
          Const::Fast::_make_readonly( \$key );
          $_flag = 1;
      }

      if (defined $arg{$key}) {
          $row->update( { $key => $arg{$key} );
      }

  }

However, if the value contains a sigil, or (for versions of Perl before 5.28) the value is not a scalar, then this uses a my variable variable

  use Const::Fast ();

  {
      Const::Fast::const my $key => "username";

      if (defined $arg{$key}) {
          $row->update( { $key => $arg{$key} );
      }
  }

The reason for using state variables is that it takes time to mark a variable as read-only, particularly for deeper data structures. However, the tradeoff for using this is that the variables remain allocated until the process exits.

If the code block is omitted, then this can be used to declare a state constant in the current scope, e.g.

  let $x = "foo";

  say $x;

Note that this may enable the state feature in the current scope.

KNOWN ISSUES

The parsing of assignments is rudimentary, and may fail when assigning to another variable or the result of a function. Because of this, you may get unusual error messages for syntax errors, e.g. "Transliteration pattern not terminated".

Because this modifies the source code during compilation, the line numbers may be changed, particularly if the let assignment(s) are on multiple lines.

SEE ALSO

feature

Const::Fast

Keyword::Simple

AUTHOR

Robert Rothenberg <rrwo@cpan.org>

COPYRIGHT AND LICENSE

This software is Copyright (c) 2019-2020 by Robert Rothenberg.

This is free software, licensed under:

  The Artistic License 2.0 (GPL Compatible)