This and other RFCs are available on the web at
http://dev.perl.org/rfc/
=head1 TITLE
Overloadable parentheses for objects
=head1 VERSION
Maintainer: pdl-porters team <[EMAIL PROTECTED]>
Date: 16 August 2000
Last Modified: 10 September 2000
Mailing List: [EMAIL PROTECTED]
Number: 115
Version: 2
Status: Developing
=head1 ABSTRACT
This RFC proposes syntactic support for a polymorphic method
that can be defined for blessed references. It would
allow the parentheses C<()> to be used for a variety of convenient
syntaxes for objects. This is principally motivated by a need
of PDL for a simple syntax of PDL object slicing.
=head1 DESCRIPTION
=head2 Motivation
Currently, PDL objects have to use quite an unwieldy syntax
for the all important slicing and indexing. In perl5 the syntax is
$n1 = $n-1; # since we need to stringify
$y = $x->slice("0:$n1:4");
$y = $x->slice("0:${\($n-1)}:4"); # even more horrible
This should be contrasted with the less cluttered syntax offered
by numerical Python and commercial systems such as Matlab and IDL:
y = x[0:n-1:4];
In perl we desire to say:
$y = $x(0:$n-1,4); # or, depending on the choice of separator
$y = $x(0:$n-1;4); # see also RFC 169
Note that we need to keep l-value subs in perl6 to avoid related
types of syntactical clumsiness if C<$x()> can invoke a subroutine
(see below).
$x(0:$n-1:4) *= 2;
should be allowed, as well as the long form
$x->slice(0:$n-1:4) *= 2;
L<RFC 81> and related RFCs propose introducing ranges as part of the
syntax cleanup, this RFC proposes C<()> overloading for
objects.
=head2 Overloading C<()>'s
If classes allowed the definition of a method that is invoked with a
syntax akin to one used with sub refs (but without the need for the
C<&> dereferencing) we could have the cake and eat it. The parentheses
method notion seems general enough to be useful for other classes.
=head2 Examples:
A possible scenario could be as follows. The class PDL
defines a default method that is invoked when a syntax
like
$<variable_name>(args)
is used, where C<$E<lt>variable_nameE<gt>> is supposed to be an
instance of the class in question (here PDL).
The PDL package would contain the definition of the
method C<PARENTHESES> (a polymorphic method along the lines of RFC 159):
package PDL;
....
sub PARENTHESES {
my $this = shift;
$this->slice(@_);
}
This would allow for the creation of a variety of powerful syntaxes
for different kinds of objects. For example in PDL we might
wish to use C<()> to slice by index value and in a derived class
PDL::World C<()> would slice by physical real-value coordinate.
One could think of this as saying that C<()> is an
operators which can be overloaded.
Note that we still would like to have such a feature even if
Perl 6 provided its own multi-dim array type. It would
give us the freedom to provide an object oriented interface
to these arrays and/or derive classes from it I<and> have
convenient slicing syntax.
=head1 IMPLEMENTATION
Changes to the parser to allow the new syntax.
We are not aware of any other conflicts with existing
or proposed language features.
=head1 SEE ALSO
RFC 159: True Polymorphic Objects
RFC 117: Perl syntax support for ranges
RFC 81: Lazily evaluated list generation functions
RFC 169: Proposed syntax for matrix element access and slicing
L<PDL> (http://pdl.sourceforge.net/PDLdocs)
http://pdl.perl.org
Numerical Python: http://starship.python.net/~da/numtut/