Modified:
doc/trunk/design/syn/S12.pod
Log:
* S12: Remove the troublesome single-arg-function-become-method rule:
sub foo (*$x) { $x }
foo(want); # Always in list context, never evaluated as "want.foo"
As an alternative solution to the "close $fh" problem, specify that
class IO has a "method close () is export" that manufactures a multi
sub-into-method dispatcher.
The export-method semantics needs more detailed treatment in the spec,
but it's important to note that "somesub $x" and "$x.somesub" are no
longer interchangeable now.
Modified: doc/trunk/design/syn/S12.pod
==============================================================================
--- doc/trunk/design/syn/S12.pod (original)
+++ doc/trunk/design/syn/S12.pod Wed Oct 4 21:16:26 2006
@@ -14,7 +14,7 @@
Date: 27 Oct 2004
Last Modified: 20 Sept 2006
Number: 12
- Version: 27
+ Version: 28
=head1 Overview
@@ -196,18 +196,24 @@
Indirect object notation now requires a colon after the invocant if
there are any arguments. If there are no arguments and you omit the
colon, the notation is parsed either as a named unary operator or a
-list operator with one argument. In any case, all of these come out
-to the same thing:
+list operator with one argument.
+
+These two are considered method calls, which will fall back to a
+subroutine call if the method was not found:
$handle.close
- close($handle)
close $handle:
- close $handle
-To explicitly reject method call and only consider subs, put a
-trailing comma after the single positional argument:
+To reject method call and only consider subs, simply omit the colon
+from the invocation line:
- close($handle,)
+ close($handle)
+ close $handle
+
+However, here the built-in B<IO> class defines C<method close is export ()>,
+which puts a C<multi sub close (IO)> in scope by default. Thus if the
+C<$handle> evaluates to an IO object, then the two subroutine calls above
+are still translated into method calls.
Dot notation can omit the invocant if it's in C<$_>: