[svn:perl6-synopsis] r14547 - doc/trunk/design/syn
Author: larry Date: Wed Jun 11 14:09:40 2008 New Revision: 14547 Modified: doc/trunk/design/syn/S03.pod Log: change most left-associative short-circuit ops to list-associative x and xx are now left associative define what associativity means for unary ops Modified: doc/trunk/design/syn/S03.pod == --- doc/trunk/design/syn/S03.pod(original) +++ doc/trunk/design/syn/S03.podWed Jun 11 14:09:40 2008 @@ -12,9 +12,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 8 Mar 2004 - Last Modified: 2 Apr 2008 + Last Modified: 11 Jun 2008 Number: 3 - Version: 135 + Version: 136 =head1 Overview @@ -36,36 +36,46 @@ L Symbolic unary! + - ~ ? | +^ ~^ ?^ \ ^ = L Multiplicative* / % +& +< +> ~& ~< ~> ?& div mod L Additive + - +| +^ ~| ~^ ?| ?^ -N Replication x xx -L Concatenation ~ +L Replication x xx +X Concatenation ~ X Junctive and & X Junctive or | ^ L Named unary sleep abs sin N Nonchaining infix but does <=> leg cmp .. ..^ ^.. ^..^ C Chaining infix!= == < <= > >= eq ne lt le gt ge ~~ === eqv !eqv -L Tight and && -L Tight or || ^^ // min max +X Tight and && +X Tight or || ^^ // min max L Conditional ?? !! ff fff R Item assignment = := ::= => += -= **= xx= .= L Loose unary true not X Comma operator, p5=> X List infixZ minmax X X~X X*X XeqvX R List prefix : print push say die map substr ... [+] [*] any $ @ -L Loose and and andthen -L Loose or or xor orelse +X Loose and and andthen +X Loose or or xor orelse N Terminator; <==, ==>, <<==, ==>>, {...}, unless, extra ), ], } -The associativities specified above are: +Using two C symbols below generically to represent any pair of operators +that have the same precedence, the associativities specified above +for binary operators are interpreted as follows: -Assoc Meaning of $a op $b op $c +Assoc Meaning of $a ! $b ! $c = = -L left ($a op $b) op $c -R right $a op ($b op $c) +L left ($a ! $b) ! $c +R right $a ! ($b ! $c) N non ILLEGAL -C chain ($a op $b) and ($b op $c) -X list op($a, $b, $c) or op($a; $b; $c) +C chain ($a ! $b) and ($b ! $c) +X list infix:($a; $b; $c) -Note that list associativity only works between identical operators. +For unaries this is interpreted as: + +Assoc Meaning of !$a! += = +L left (!$a)! +R right !($a!) +N non ILLEGAL + +Note that list associativity (X) only works between identical operators. If two different list-associative operators have the same precedence, they are assumed to be left-associative with respect to each other. For example, the C cross operator and the C zip operator both @@ -77,6 +87,9 @@ (@a X @b) Z @c +Similarly, if the only implementation of a list-associative operator +is binary, it will be treated as left associative. + If you don't see your favorite operator above, the following sections cover all the operators in precedence order. Basic operator descriptions are here; special topics are covered afterwards. @@ -659,7 +672,7 @@ ^$limit -Constructs a range of C<0..^$limit> or locates a metaclass as a shortcut +Constructs a range of C<0 ..^ $limit> or locates a metaclass as a shortcut for C<$limit.HOW>. See L. =item * @@ -932,7 +945,7 @@ C<< infix:<&> >>, all() operator -$x & $y +$a & $b & $c ... =back @@ -944,13 +957,13 @@ C<< infix:<|> >>, any() operator -$x | $y +$a | $b | $c ... =item * C<< infix:<^> >>, one() operator -$x ^ $y +$a ^ $b ^ $c ... =back @@ -1042,6 +1055,11 @@ Constructs Range objects, optionally excluding one or both endpoints. See L. +Note that these differ: + +$min ..^ $max $ min .. $max-1 +$min .. ^$max # $min .. (0..$max-1) + =back =head2 Chaining binary precedence @@ -1145,10 +1163,10 @@ C<< infix:<&&> >>, short-circuit and -$condition && $whentrue +$a && $b && $c ... -Returns the left argument if the left argument is false, otherwise -evaluates and returns the right argument. In list context forces +Returns the first argument that evaluates to false, otherwise +returns the result of the last argument. In list context forces a false return to mean C<()>. See C below for low-precedence version. @@ -1160,13 +1178,14 @@ =item * -C<< infix:<||> >>, short-circuiting inclusive-or +C<< infix:<||> >>, short-circuit inclusive-or -$condition || $whenfalse +$a || $b || $c ... -Returns the left argu
Re: [svn:perl6-synopsis] r14547 - doc/trunk/design/syn
On Wed, Jun 11, 2008 at 02:09:41PM -0700, [EMAIL PROTECTED] wrote: > +Note that these differ: > + > +$min ..^ $max$ min .. $max-1 > +$min .. ^$max# $min .. (0..$max-1) The punctuation looks a little funny on the first line. Also, are $min ..^ $max and $min .. $max-1 really the same range? I'm a little curious about the second line, is that even legal? It seems to me a Range should only allow itself to be constructed from endpoints with a well-defined ordering, so a Range of Ranges should be illegal. Or does the .. end up pulling a num out of the ^$max range iterator for its endpoint somehow via MMD? -ryan
S12 Patch for metacalls, Representation API (Was: Re: Foo.HOW.metamethod vs Foo.^metamethod)
Seg, 2008-06-09 às 17:51 -0700, Larry Wall escreveu: > On Sat, Jun 07, 2008 at 09:49:03PM +0100, Daniel Ruoso wrote: > : 2) Assume the capture-translation and define that > : $foo.HOW.can($foo,'bar') keeps the $how as the invocant and must receive > : the referring object as first argument. > I prefer this approach, I think. I took the liberty to write a patch to S12 with this new context. The extended format $foo.HOW.methods($foo) becomes a little awkward, specially for Class based OO. Maybe there should be a more extended modification to promote the .^methods syntax, since $foo.HOW is then more usefull for prototype-based OO, where $foo.HOW might be, for instance, Prototype::Delegation::C3 or Prototype::Concatenation. This actually brings me to another issue, which is how much do we expect for this prototype-based meta implementations to be exchangeable between Perl 6 implementations? The point is that they *must* be representation independent, so that you can use it with whatever low-level object metainstance (in the Moose jargon) you like, and for that to be possible, we need a representation API. SMOP is already pointing in that direction, take a look at: * http://www.perlfoundation.org/perl6/index.cgi?smop_oo_api * http://svn.pugscode.org/pugs/v6/smop/src-s1p/P6Meta.pm daniel __DATA__ Index: S12.pod === --- S12.pod (revision 14546) +++ S12.pod (working copy) @@ -123,11 +123,15 @@ C method. A "class" object is just considered an "empty" instance in Perl 6, more properly called a "prototype" object, or just "protoobject". -The actual class object is the metaclass object pointed to by the -C syntax. So when you say "C", you're referring to both a -package and a protoobject, that latter of which points to the -actual object representing the class via C. The protoobject -differs from an instance object not by having a different + +In a class-based OO implementation, the actual class object is the +metaclass object pointed to by the C syntax. So when you say +"C", you're referring to both a package and a protoobject, that +latter of which points to the actual object representing the class via +C. In a prototype-based OO implementation, on the other hand, the +metaclass object is probably going to be shared by several types and +the methods are most likely going to be stored in the prototypes. The +protoobject differs from an instance object not by having a different type but rather in the extent to which it is defined. Some objects may tell you that they are defined, while others may tell you that they are undefined. That's up to the object, and depends on how the @@ -1892,23 +1896,29 @@ $x === $y $obj.bless(%args) -Every class has a C function/method that lets you get at the -class's metaobject, which lets you get at all the metadata properties -for the class (or other metaobject protocol) implementing the objects -of the class: +Every object, defined or not, has a C function/method that lets +you get at the metaobject, which lets you get at all the metadata +properties for the type (or other metaobject protocol) implementing +the objects of the type: -MyClass.methods() # call MyClass's .methods method (error?) -MyClass.HOW.methods() # get the method list of MyClass +MyClass.methods()# call MyClass's .methods method (error?) +MyClass.HOW.methods(MyClass) # get the method list of MyClass The C<^> metasyntax is equivalent to C<.HOW>: -MyClass.HOW.methods() # get the method list of MyClass -^MyClass.methods() # get the method list of MyClass -MyClass.^methods() # get the method list of MyClass +MyClass.HOW.methods(MyClass) # get the method list of MyClass +^MyClass.methods(MyClass) -Each object of the class also has a C<.HOW> or C<.^> method: +When using the C<^> metasyntax in the method invocation, it also +implies a translation in the capture, passing the invocant as first +argument: -$obj.HOW.methods(); +MyClass.HOW.methods(MyClass) # get the method list of MyClass +MyClass.^methods() # equivalent shorter syntax + +Each object of the type also has a C<.HOW> or C<.^> method: + +$obj.HOW.methods($obj); $obj.^methods(); Class traits may include: @@ -1964,9 +1974,9 @@ Strictly speaking, metamethods like C<.isa()>, C<.does()>, and C<.can()> should be called through the meta object: -$obj.HOW.can("bark") -$obj.HOW.does(Dog) -$obj.HOW.isa(Mammal) +$obj.HOW.can($obj, "bark") +$obj.HOW.does($obj, Dog) +$obj.HOW.isa($obj, Mammal) or @@ -1992,7 +2002,7 @@ actually calls: -$obj.HOW.does(Dog) +$obj.HOW.does($obj, Dog) which is true if C<$obj> either "does" or "isa" C (or "isa" something that "does" C). If C is a subset, any additional
[svn:perl6-synopsis] r14548 - doc/trunk/design/syn
Author: larry Date: Wed Jun 11 16:26:27 2008 New Revision: 14548 Modified: doc/trunk/design/syn/S03.pod Log: clarification of reduced short-circuit ops Modified: doc/trunk/design/syn/S03.pod == --- doc/trunk/design/syn/S03.pod(original) +++ doc/trunk/design/syn/S03.podWed Jun 11 16:26:27 2008 @@ -1203,8 +1203,15 @@ is true. In list context forces a false return to mean C<()>. See C below for low-precedence version. -Similar to the C<[^^]> reduce operator, but short-circuits in the sense -that it does not evaluate any arguments after a 2nd true result. +This operator short-circuits in the sense that it does not evaluate +any arguments after a 2nd true result. Closely related is the reduce +operator: + +[^^] a(), b(), c() ... + +but note that reduce operators are not macros but ordinary list +operators, so c() is always called before the reduce is done. + =item * @@ -1704,7 +1711,7 @@ [+] [*] [<] [\+] [\*] etc. -See L. +See L below. =item * @@ -3486,7 +3493,7 @@ [-] 4, 3, 2; # 4-3-2 = (4-3)-2 = -1 [**] 4, 3, 2; # 4**3**2 = 4**(3**2) = 262144 -For list-associating operators (like C<< < >>), all arguments are taken +For chain-associative operators (like C<< < >>), all arguments are taken together, just as if you had written it out explicitly: [<] 1, 3, 5; # 1 < 3 < 5 @@ -3635,6 +3642,15 @@ (And, in fact, the latter are already easy to express anyway, and more obviously nonsensical.) +Similarly, list-associative operators that have the thunk-izing characteristics of +macros (such as short-circuit operators) lose those macro-like characteristics. +You can say + +[||] a(), b(), c(), d() + +to return the first true result, but the evaluation of the list is controlled +by the semantics of the list, not the semantics of C<||>. + Most reduce operators return a simple scalar value, and hence do not care whether they are evaluated in item or list context. However, as with other list operators and functions, a reduce operator may return a list
[svn:perl6-synopsis] r14549 - doc/trunk/design/syn
Author: larry Date: Wed Jun 11 16:49:17 2008 New Revision: 14549 Modified: doc/trunk/design/syn/S03.pod Log: Fixes suggested by Ryan++ Modified: doc/trunk/design/syn/S03.pod == --- doc/trunk/design/syn/S03.pod(original) +++ doc/trunk/design/syn/S03.podWed Jun 11 16:49:17 2008 @@ -1057,8 +1057,11 @@ Note that these differ: -$min ..^ $max $ min .. $max-1 -$min .. ^$max # $min .. (0..$max-1) +0 ..^ 10 # 0 .. 9 +0 .. ^10 # 0 .. (0..9) + +(It's not yet clear what the second one should mean, but whether it +succeeds or fails, it won't do what you want.) =back
Re: [svn:perl6-synopsis] r14549 - doc/trunk/design/syn
On Wed, Jun 11, 2008 at 04:49:18PM -0700, [EMAIL PROTECTED] wrote: > -$min ..^ $max$ min .. $max-1 > -$min .. ^$max# $min .. (0..$max-1) > +0 ..^ 10 # 0 .. 9 > +0 .. ^10 # 0 .. (0..9) Ah, I should have been more specific - I meant that, since ~~ treats Ranges as continuous intervals, 0 ..^ 10 isn't the same as 0 .. 9. Although I guess there's no way to unabbreviate 0 ..^ 10... -ryan
Re: [svn:perl6-synopsis] r14549 - doc/trunk/design/syn
On Wed, Jun 11, 2008 at 08:20:41PM -0400, Ryan Richter wrote: : On Wed, Jun 11, 2008 at 04:49:18PM -0700, [EMAIL PROTECTED] wrote: : > -$min ..^ $max $ min .. $max-1 : > -$min .. ^$max # $min .. (0..$max-1) : > +0 ..^ 10 # 0 .. 9 : > +0 .. ^10 # 0 .. (0..9) : : Ah, I should have been more specific - I meant that, since ~~ treats : Ranges as continuous intervals, 0 ..^ 10 isn't the same as 0 .. 9. : Although I guess there's no way to unabbreviate 0 ..^ 10... Well, maybe 0 .. 10-ε or some such. Larry
[svn:perl6-synopsis] r14550 - doc/trunk/design/syn
Author: larry Date: Wed Jun 11 17:34:50 2008 New Revision: 14550 Modified: doc/trunk/design/syn/S05.pod Log: fixed "samebase" illogic pointed out by moritz++ Modified: doc/trunk/design/syn/S05.pod == --- doc/trunk/design/syn/S05.pod(original) +++ doc/trunk/design/syn/S05.podWed Jun 11 17:34:50 2008 @@ -14,9 +14,9 @@ Maintainer: Patrick Michaud <[EMAIL PROTECTED]> and Larry Wall <[EMAIL PROTECTED]> Date: 24 Jun 2002 - Last Modified: 18 May 2008 + Last Modified: 11 Jun 2008 Number: 5 - Version: 79 + Version: 80 This document summarizes Apocalypse 5, which is about the new regex syntax. We now try to call them I rather than "regular @@ -181,7 +181,7 @@ The single-character modifiers also have longer versions: :i:ignorecase - :b:basechar + :a:ignoreaccent :g:global =item * @@ -227,7 +227,7 @@ =item * -The C<:b> (or C<:basechar>) modifier scopes exactly like C<:ignorecase> +The C<:a> (or C<:ignoreaccent>) modifier scopes exactly like C<:ignorecase> except that it ignores accents instead of case. It is equivalent to taking each grapheme (in both target and pattern), converting both to NFD (maximally decomposed) and then comparing the two base @@ -237,7 +237,7 @@ includes all ignored characters, including any that follow the final base character. -The C<:bb> (or C<:samebase>) variant may be used on a substitution to change the +The C<:aa> (or C<:sameaccent>) variant may be used on a substitution to change the substituted string to the same accent pattern as the matched string. Accent info is carried across on a character by character basis. If the right string is longer than the left one, the remaining characters @@ -968,8 +968,8 @@ unless it happens to be a C object, in which case it is matched as a subrule. As with scalar subrules, a tainted subrule always fails. All string values pay attention to the current C<:ignorecase> -and C<:basechar> settings, while C values use their own -C<:ignorecase> and C<:basechar> settings. +and C<:ignoreaccent> settings, while C values use their own +C<:ignorecase> and C<:ignoreaccent> settings. When you get tired of writing: @@ -1069,7 +1069,7 @@ =back All hash keys, and values that are strings, pay attention to the -C<:ignorecase> and C<:basechar> settings. (Subrules maintain their +C<:ignorecase> and C<:ignoreaccent> settings. (Subrules maintain their own case settings.) You may combine multiple hashes under the same longest-token
[svn:perl6-synopsis] r14551 - doc/trunk/design/syn
Author: larry Date: Wed Jun 11 17:53:27 2008 New Revision: 14551 Modified: doc/trunk/design/syn/S05.pod Log: added <...> et al. as suggested by ruoso++ Modified: doc/trunk/design/syn/S05.pod == --- doc/trunk/design/syn/S05.pod(original) +++ doc/trunk/design/syn/S05.podWed Jun 11 17:53:27 2008 @@ -16,7 +16,7 @@ Date: 24 Jun 2002 Last Modified: 11 Jun 2008 Number: 5 - Version: 80 + Version: 81 This document summarizes Apocalypse 5, which is about the new regex syntax. We now try to call them I rather than "regular @@ -1410,6 +1410,15 @@ =item * +The C<< <...> >>, C<< >>, and C<< >> special tokens +have the same "not-defined-yet" meanings within regexes that the bare +elipses have in ordinary code. (However, by the recursive rules above, +C<< >> is equivalent to C<< >>, which matches the null string. +Likewise C<< >> is just like C<< >>, except +that it is ignored by the longest-token matcher.) + +=item * + A leading C<*> indicates that the following pattern allows a partial match. It always succeeds after matching as many characters as possible. (It is not zero-width unless 0 characters match.)