This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1 TITLE

Parse C<func($obj, @args)> as C<func $obj (@args)>

=head1 VERSION

   Maintainer: Nathan Wiger <[EMAIL PROTECTED]>
   Date: 29 Aug 2000
   Mailing List: [EMAIL PROTECTED]
   Version: 1
   Number: 174
   Status: Developing

=head1 ABSTRACT

Currently, Perl 5 makes a distinction between subs called in the
indirect object vs. function form:

   $r = new CGI;          # CGI->new
   $r = new CGI (@args);  # CGI->new(@args)
   $r = new(CGI  @args);  # mail::new(main::CGI(@args))
   $r = new(CGI, @args);  # main::new(CGI, @args)

This causes many problems, such as having to have special prototypes
that translate the optional first argument object into the indirect
object syntax.

In Perl 6, this distinction should be dropped. Instead, the second form
should be automatically translated to the first when necessary. This
fixes a lot of stuff, and breaks nothing. Read on... :-)

=head1 DESCRIPTION

=head2 Overview

Let's get into a more subtle example:

   close $FILE;      # $FILE->close as in L<RFC 14>
   close($FILE);     # main::close($FILE)

Here, we have to include a function in CORE called C<close> which, at
the very least, just turns around and reforks the appropriate method
call.

While this works for C<close> (as implemented currently), if we want
user-level consistent behavior, our other functions "don't work right":

   close(FILE);      # ok
   $r = new(CGI);    # nope

This should be made to work correctly. The following order of function
parsing should apply to Perl 6:

   1. The current package should be checked for a function
      by that name (including any imported ones), consistent
      with current behavior.

   2. Argument 1 should be checked to see if it is a valid
      object reference. If so, the method should be checked
      for existence as a member.

   3. AUTOLOAD should be called.

The only new step here is step #2. Notice that this does NOT override
current-package functions. Only if a function is not found in the
current package is the translation attempted.

=head2 Why this is Needed

At first, this may seem like syntactic sugar. It's not, it's much more
than that.

In fact, this is needed to make Perl 6 much more flexible and to reduce
the number of core methods. It also meshes completely with RFC 161 on
embedded objects. In fact, every existing method can become a member
function if we so desire:

   $xa = abs($x);         # main::abs($x) || $x->abs
   $r = new(CGI, @args);  # CGI->new(@args)
   dostuff(@stuff);       # $stuff[0]->dostuff(@stuff[1..$#stuff])
   
This adds a great amount of flexibility and transparency for users. In
fact, C<close> and C<open> could leave core altogether, instead being
called on the objects:

   $FILE = open http "http://www.yahoo.com/";   # http->open
   close($FILE);                                # $FILE->close

While this is by no means required, it should be obvious what the
benefits of being able to do this are. It makes the core syntax much
more flexible, and reduces the need to include simple translator
prototypes. It also makes L<RFC 168>, "Built-in functions should be
functions", much more realistic since these prototypes no longer have to
handle the special case of an "optional first argument object".

=head2 Syntax

Just to clarify the syntax some, the following three should be
equivalent:

   $r = new CGI (@args);  # CGI->new(@args)
   $r = new(CGI, @args);  # CGI->new(@args)
   $r = new(CGI  @args);  # CGI->new(@args)

Note that the comma following the object is optional.

These two cases actually involve subtly different changes to Perl's
parsing rules. The third one will try to find a C<main::CGI> function
and call it on C<@args>. I would say that only if this fails, and
C<main::CGI> is not found, should the translation be attempted. As such,
the third form would require an extra step and might be slightly slower
than the second one.

=head1 IMPLEMENTATION

Hold on.

=head1 MIGRATION

This introduces new functionality that does not break any existing code.
No translation should be required.

=head1 REFERENCES

RFC 14: Modify open() to support FileObjects and Extensibility 

RFC 168: Built-in functions should be functions 

RFC 161: OO Integration/Migration Path

http://www.mail-archive.com/perl6-language%40perl.org/msg03186.html

http://www.mail-archive.com/perl6-language-objects%40perl.org/msg00097.html

Reply via email to