Author: larry Date: Fri Aug 25 12:28:00 2006 New Revision: 11421 Modified: doc/trunk/design/syn/S06.pod
Log: Discussed relationship of "is" syntax to adverb syntax and type syntax. Nailed down some (hopefully) sane default behaviors for equiv and assoc. Modified: doc/trunk/design/syn/S06.pod ============================================================================== --- doc/trunk/design/syn/S06.pod (original) +++ doc/trunk/design/syn/S06.pod Fri Aug 25 12:28:00 2006 @@ -13,9 +13,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 21 Mar 2003 - Last Modified: 18 Aug 2006 + Last Modified: 25 Aug 2006 Number: 6 - Version: 52 + Version: 53 This document summarizes Apocalypse 6, which covers subroutines and the @@ -590,7 +590,7 @@ (Conjectural: Within the body you may also use C<exists> on the parameter name to determine whether it was passed. Maybe this will have to be restricted to the C<?> form, unless we're willing to admit that a parameter -could be simultaneously defined and non-existant.) +could be simultaneously defined and non-existent.) =head2 Named parameters @@ -1663,7 +1663,14 @@ =head2 Subroutine traits These traits may be declared on the subroutine as a whole (individual -parameters take other traits). +parameters take other traits). Trait syntax depends on the particular +auxiliary you use, but for C<is>, the subsequent syntax is identical to +adverbial syntax, except that that colon may be omitted or doubled depending +on the degree of ambiguity desired: + + is ::Foo[...] # definitely a parameterized typename + is :Foo[...] # definitely a pair with a list + is Foo[...] # depends on whether Foo is predeclared as type =over @@ -1707,28 +1714,80 @@ =item C<is tighter>/C<is looser>/C<is equiv> Specifies the precedence of an operator relative to an existing -operator. C<equiv> also specifies the default associativity to -be the same as the operator to which the new operator is equivalent. -C<tighter> and C<looser> operators default to being left associative. +operator. C<tighter> and C<looser> operators default to being left +associative. + +C<equiv> on the other hand also clones other traits, so it specifies +the default associativity to be the same as the operator to which +the new operator is equivalent. The following are the default +equivalents for various syntactic categories if neither C<equiv> nor +C<assoc> is specified. (Many of these have no need of precedence +or associativity because they are parsed specially. Nevertheless, +C<equiv> may be useful for cloning other traits of these operators.) + + term:<*> + quote:<q> + prefix:<++> + infix:<+> + postfix:<++> + circumfix:<( )> + postcircumfix:<( )> + regex_metachar:<.> + regex_backslash:<w> + regex_assertion:<?> + regex_mod_internal:<i> + regex_mod_external:<i> + trait_verb:<of> + trait_auxiliary:<is> + scope_declarator:<my> + statement_control:<if> + statement_modifier:<if> + infix_prefix_meta_operator:<!> + infix_postfix_meta_operator:<=> + postfix_prefix_meta_operator:{'»'} + prefix_postfix_meta_operator:{'«'} + infix_circumfix_meta_operator:{'»','«'} + prefix_circumfix_meta_operator:{'[',']'} + +The existing operator may be specified either as a function name +or as a string slice equivalent to the one that would be used in +the complete function name. In string slice form the syntactic +category will be assumed to be the same as the new declaration. +Therefore these all have the same effect: + + sub postfix:<!> ($x) is equiv(&postfix:<++>) {...} + sub postfix:<!> ($x) is equiv<++> {...} + sub postfix:<!> ($x) {...} # since equiv<++> is the default + +Prefix operators that are identifiers are handled specially. Both of + + sub foo ($) {...} + sub prefix:<foo> ($) {...} + +default to named unary precedence despite declaring a prefix operator. +Likewise postfix operators that look like method calls are forced to +default to the precedence of method calls. =item C<is assoc> Specifies the associativity of an operator explicitly. Valid values are: - Tag Examples Meaning of $a op $b op $c - === ======== ========================= - left + - * / x ($a op $b) op $c - right ** = $a op ($b op $c) - non cmp <=> .. ILLEGAL - chain == eq ~~ ($a op $b) and ($b op $c) - list | & ^ ¥ listop($a, $b, $c) or listop($a; $b; $c) - + Tag Examples Meaning of $a op $b op $c Default equiv + === ======== ========================= ============= + left + - * / x ($a op $b) op $c + + right ** = $a op ($b op $c) ** + non cmp <=> .. ILLEGAL cmp + chain == eq ~~ ($a op $b) and ($b op $c) eqv + list | & ^ ¥ op($a, $b, $c) | Note that operators "C<equiv>" to relationals are automatically considered chaining operators. When creating a new precedence level, the chaining -is determined by the presence or absence of "C<is assoc('chain')>", +is determined by the presence or absence of "C<< is assoc<chain> >>", and other operators defined at that level are required to be the same. +Specifying an C<assoc> without an explicit C<equiv> substitutes a default +C<equiv> consistent with the associativity, as shown in the final column above. + =item C<PRE>/C<POST> Mark blocks that are to be unconditionally executed before/after