On Fri, 2006-07-14 at 00:08 +0300, Yuval Kogman wrote:

> Also, sometimes i am matching on behalf of my caller, this is very
> common in dispatch algorithms, or things like tree visitors:
> 
>       my @list = $tree.filter_children( $match ); # very generic and useful

It's really the fact that that's a method that hoses everything. There's
essentially no way to compile-time dispatch that, so even macros won't
help you.... grr.

No, you've got me. There needs to be a way to do that, but oh dear it's
going to be confusing, and as ever, I worry about those who will use
this sort of thing poorly or mistakenly, and then rant on about how Perl
is write-only.

Perhaps the solution is not code, but documentation. Perhaps if we make
a clean break between comparison and matching in the docs, and push
people away from non-regex/string-~~ until they understand its
implications, we can head off much of the lossage.

For example (modified S03 "Smart matching" section without the table):

=head1 Smart matching

Smart matching is the process of asking, does thing I<a> conform to the
specification of I<b>? The most common reason to want to do this is to
match a string against a regex:

 if $s ~~ /^\d+$/ { ... }

But smart matching is also performed by given/when for switch-like behavior:

 given $s {
   when 'Apple' { ... }
   when 'Pear'  { ... }
   default      { die "No fruit!" }
 }

Notice that the specification can also be a string, as above, but because
C<eqv> and C<~~> mean the same thing in this context, it is clearer, when
writing a single expression to explicitly use C<eqv>:

 if $a eqv $b { ... }

The right-hand side of C<~~> (the specification) always controls the
nature of the matching, so care must be taken when matching. Do not
think of this as simple "comparison" where the arguments are considered
peers.

Here is the current table of smart matches with respect to $_ and $x
as they would be used here:

 given $_ {
   when $x {...}
 }

or

 $_ ~~ $x

The list is intended to reflect forms that can be recognized at
compile time.  If none of these forms is recognized at compile time, it
falls through to do MMD to C<< infix:<~~>() >>, which presumably
reflects similar semantics, but can finesse things that aren't exact
type matches.  Note that all types are scalarized here.  Both C<~~>
and C<given>/C<when> provide scalar contexts to their arguments.
(You can always hyperize C<~~> explicitly, though.)

Both C<$_> (the value) and C<$x> (the match specification) here are
potentially references to container objects.
And since lists promote to arrays in scalar context, there need be no
separate entries for lists.

(table goes here)

-- 
Aaron Sherman <[EMAIL PROTECTED]>
Senior Systems Engineer and Toolsmith
"We had some good machines, but they don't work no more." -Shriekback


Reply via email to