develooper Front page | perl.perl6.language | Postings from July 2006

[svn:perl6-synopsis] r10299 - doc/trunk/design/syn

Thread Next
July 18, 2006 20:26
[svn:perl6-synopsis] r10299 - doc/trunk/design/syn
Message ID:
Author: larry
Date: Tue Jul 18 20:26:43 2006
New Revision: 10299


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 <>
   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)		# $ 	-- must be "dot" method with () args
     .foo		# $ 	-- must be "dot" method with no args
     .$foo:		# $_.$foo: 1 	-- indirect "dot" method with : args
-    foo bar: 1		#	-- bar must be predecl as class or sub
-					-- foo method call even if declared sub
+    foo bar: 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		# $	-- 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 <>
   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
+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
+    $<a b c>
+to mean
+    ${'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.]
+    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
-    $<a b c>
-to mean
-    ${'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'}   =;
      %cats\   .{'fluffy'} =;
+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 Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About