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

HOI::Match - Higher-Order Imperative "Re"features in Perl

SYNOPSIS

  use HOI::Match;
  blah blah blah

  sub point_extract {
      HOI::Match::pmatch(
          "point (x _) :: r" => sub { my %args = @_; $args{x} + point_extract($args{r}) },
          "nil" => sub { 0 }
      )->(@_)
  }

  point_extract(
      [ 
          {"type" => "point", "val" => [ 1, 2 ]},
          {"type" => "point", "val" => [ 2, 4 ]},
          {"type" => "point", "val" => [ 3, 6 ]},
      ]
  ) # we will get 6

DESCRIPTION

HOI::Match offers Erlang-like pattern matching in function parameters. Currently only wildcard symbols, lists and algebraic-data-type like hashrefs are supported.

A wildcard symbol ([A-Za-z_][A-Za-z0-9_]*) matches exactly one argument. A list is represented as an array reference. An algebraic-data-typed object is represented as an hashref with two keys, namely "type", which gives its typename, and "val", which is an array refer- ence containing zero or more wildcard symbols, lists, or algebraic-data- typed objects.

The BNF used to define the pattern grammar is given below:

Types: Type | Type COMMA Types

Type: IDENT | Type CONCAT Type | NIL | IDENT LPAREN Typelist RPAREN

Typelist: <eps> | Type Typelist

where

IDENT = [A-Za-z_][A-Za-z0-9_]* CONCAT = :: NIL = nil LPAREN = ( RPAREN = ) COMMA = ,

are tokens.

pmatch

The function pmatch takes an hash-formed array, which contains pattern- subroutine pairs, where patterns are strings, sequently.

The patterns will be matched sequently. That is,

    "x, y"
    "point (_ x), y"

on arguments ( { "type" => "point", "val" => [ 1, 2 ] }, 3 ) will be successfully matched with pattern "x, y" instead of "point (_ x), y".

On a successful match, the values corresponding to identifiers in the pattern will be passed to the subroutine in a hash. You can access them as named argu- ments with

    my %args = @_;

Identifiers that begin with an underscore ('_') will be ignored. They will not be passed to the subroutine.

AUTHOR

withering <lt>withering@cpan.org<gt>

COPYRIGHT AND LICENSE

Copyright (C) 2014 by withering

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.18.2 or, at your option, any later version of Perl 5 you may have available.