RFC 115 (v2) Overloadable parentheses for objects
[email protected] (Perl6 RFC Librarian)
| Newsgroups | perl.perl6.announce.rfc,perl.perl6.language |
|---|---|
| Message-ID | <[email protected]> |
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/