NAME
HOI::Match - Higher-Order Imperative "Re"features in Perl
SYNOPSIS
use HOI::Match;
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 reference 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 arguments with
my %args = @_;
Identifiers that begin with an underscore ('_') will be ignored. They will not be passed to the subroutine.
AUTHOR
withering <withering@cpan.org>
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.