Front page | perl.perl6.language |
Postings from July 2006
[svn:perl6-synopsis] r10299 - doc/trunk/design/syn
Thread Next
From:
larry
Date:
July 18, 2006 20:26
Subject:
[svn:perl6-synopsis] r10299 - doc/trunk/design/syn
Message ID:
20060719032644.275B3CBABC@x12.develooper.com
Author: larry
Date: Tue Jul 18 20:26:43 2006
New Revision: 10299
Modified:
doc/trunk/design/syn/S02.pod
doc/trunk/design/syn/S03.pod
Log:
Tightening up deceptive syntaxes a bit.
Modified: doc/trunk/design/syn/S02.pod
==============================================================================
--- doc/trunk/design/syn/S02.pod (original)
+++ doc/trunk/design/syn/S02.pod Tue Jul 18 20:26:43 2006
@@ -12,9 +12,9 @@
Maintainer: Larry Wall <larry@wall.org>
Date: 10 Aug 2004
- Last Modified: 12 July 2006
+ Last Modified: 18 July 2006
Number: 2
- Version: 50
+ Version: 51
This document summarizes Apocalypse 2, which covers small-scale
lexical items and typological issues. (These Synopses also contain
@@ -1291,7 +1291,7 @@
a => %foo<a> %foo:<a>
Note that as usual the C<{...}> form can indicate either a closure or a hash
-depending on the contents.
+depending on the contents. It does I<not> indicate a subscript.
Note also that the C<< <a b> >> form is not a subscript and is therefore
equivalent not to C<.{'a','b'}> but rather to C<('a','b')>. Bare C<< <a> >>
@@ -1761,8 +1761,9 @@
.foo(1) # $_.foo(1) -- must be "dot" method with () args
.foo # $_.foo() -- must be "dot" method with no args
.$foo: # $_.$foo: 1 -- indirect "dot" method with : args
- foo bar: 1 # bar.foo(1) -- bar must be predecl as class or sub
- -- foo method call even if declared sub
+ foo bar: 1 # bar.foo(1) -- bar must be predecl as class
+ -- sub bar allowed here only if 0-ary
+ -- otherwise you must say (bar):
foo bar 1 # foo(bar(1)) -- both subject to postdeclaration
-- never taken as indirect object
foo $bar: 1 # $bar.foo(1) -- indirect object even if declared sub
Modified: doc/trunk/design/syn/S03.pod
==============================================================================
--- doc/trunk/design/syn/S03.pod (original)
+++ doc/trunk/design/syn/S03.pod Tue Jul 18 20:26:43 2006
@@ -12,9 +12,9 @@
Maintainer: Larry Wall <larry@wall.org>
Date: 8 Mar 2004
- Last Modified: 16 Jul 2006
+ Last Modified: 18 Jul 2006
Number: 3
- Version: 49
+ Version: 50
=head1 Changes to existing operators
@@ -245,20 +245,54 @@
indicated via whitespace between the list operator and the first
argument. If there is whitespace, it is always a list operator,
and the next token will be taken as the first term of the list (or
-if there are no terms, as the expression terminator).
+if there are no terms, as the expression terminator). Any infix operator
+occurring where a term is expected will be misinterpreted as a term:
-If there is no whitespace, the operator is never taken as a list
-operator, but always as a functional operator. Postfixes are
-specifically disallowed right after the operator except for the
-parenthetical forms delimiting the argument list. The parentheses
-are optional if and only if there are no arguments. If there are
-parentheses, they may be followed by any postfix operator. Unlike
-postfix operators, infix operators and expression terminators are
-allowed without intervening whitespace, and will be taken to indicate
-that the operator is a function with no arguments.
+ say + 2; # means say(+2);
+
+If there is no whitespace, subsequent parsing depends on the
+syntactic category of the next item. Parentheses (with or without
+a dot) turn the list operator into a function call instead, and
+all the function's arguments must be passed inside the parentheses
+(with the sole exception of an adverbial block, which may follow the
+parentheses).
+
+Other than various forms of parentheses, all other postfixes are
+disallowed immediately after a list operator, even if there are no
+arguments. To add a postfix to an argumentless list operator you
+must write it as a function call with empty parentheses:
+
+ foo.[] # ILLEGAL
+ foo++ # ILLEGAL
+ foo().[] # legal
+ foo()++ # legal (if foo() is rw)
+
+After the parentheses any postfix operators are allowed, and apply
+to the result of the function call. (Also note that the postfix
+restriction applies only to list operators; it doesn't apply to
+methods. It is legal to say
+
+ $foo.bar<a b c>
+
+to mean
+
+ $foo.bar().{'a','b','c'}
+
+because methods never assume there are arguments unless followed by
+parentheses or a colon.)
+
+If the next item after the list operator is either an infix operator
+or a term, a syntax error. [Conjecture: this may be relaxed in
+non-strict mode.]
Examples:
+ say foo + 1; say(foo(+1));
+ say foo $x; say(foo($x));
+ say foo$x; ILLEGAL, need space or parens
+ say foo+1; ILLEGAL, need space or parens
+ say foo++; ILLEGAL, need parens
+
say foo($bar+1),$baz say(foo($bar+1), $baz);
say foo.($bar+1),$baz say(foo($bar+1), $baz);
say foo ($bar+1),$baz say(foo($bar+1, $baz));
@@ -294,21 +328,11 @@
whitespace dependency in order to gain a completely extensible class
of postfix operators.
-Also note that the postfix restriction applies only to list operators;
-it doesn't apply to methods. It is legal to say
-
- $foo.bar<a b c>
-
-to mean
-
- $foo.bar().{'a','b','c'}
-
-because methods never assume there are arguments unless followed by
-parentheses or a colon.
-
=item * A list operator's arguments are also terminated by a closure
that is not followed by a comma or colon. (And a semicolon is implied if
-the closure is the final thing on a line.)
+the closure is the final thing on a line.) This final closure may be
+followed by a postfix, in which case the postfix is applied to the result
+of the entire list operator.
=item * A function predeclared as 0-ary is never considered list
operator, though it allows an optional set of empty parentheses.
@@ -1305,7 +1329,7 @@
$hacker.feed: :xxx('Pizza and cola'), 1,2,3;
-(For similar reasons it's best to put whitespace after the colon of a label.)
+(For similar reasons it's required to put whitespace after the colon of a label.)
=head1 Traversing arrays in parallel
@@ -1372,6 +1396,18 @@
%people\ .{'john'} = Person.new;
%cats\ .{'fluffy'} = Cat.new;
+Whitespace is in general required between any keyword and any opening
+bracket that is I<not> introducing a subscript or function arguments.
+Any keyword followed directly by parentheses will be taken as a
+function call instead.
+
+ if $a == 1 { say "yes" } # preferred syntax
+ if ($a == 1) { say "yes" } # P5-ish if construct
+ if($a,$b,$c) # if function call
+
+It is possible for C<if()> to also invoke a macro call, but if so, it's a
+C<< prefix:<if> >> macro rather than a C<< statement_control:<if> >> macro.
+
=head1 Precedence
Perl 6 has 22 precedence levels (which is fewer than Perl 5):
Thread Next
-
[svn:perl6-synopsis] r10299 - doc/trunk/design/syn
by larry