Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

5 views
Skip to first unread message

la...@cvs.perl.org

unread,
Feb 2, 2007, 4:07:38 AM2/2/07
to perl6-l...@perl.org
Author: larry
Date: Fri Feb 2 01:07:36 2007
New Revision: 13564

Modified:
doc/trunk/design/syn/S03.pod
doc/trunk/design/syn/S12.pod

Log:
Also allow colon pair syntax for a methodlike kind of filetest.
A bit of junctional cleanup.


Modified: doc/trunk/design/syn/S03.pod
==============================================================================
--- doc/trunk/design/syn/S03.pod (original)
+++ doc/trunk/design/syn/S03.pod Fri Feb 2 01:07:36 2007
@@ -12,9 +12,9 @@

Maintainer: Larry Wall <la...@wall.org>
Date: 8 Mar 2004
- Last Modified: 1 Feb 2007
+ Last Modified: 2 Feb 2007
Number: 3
- Version: 95
+ Version: 96

=head1 Overview

@@ -29,7 +29,7 @@
Level Examples
===== ========
Terms 42 3.14 "eek" qq["foo"] $x :!verbose
- Method postfix .meth .+ .? .* .() .[] .{} .<> .«» .:: .= .^
+ Method postfix .meth .+ .? .* .() .[] .{} .<> .«» .:: .= .^ .:
Autoincrement ++ --
Exponentiation **
Symbolic unary ! + - ~ ? $ @ % & | +^ ~^ ?^ \ ^ =
@@ -1408,12 +1408,23 @@

=item *

-The filetest operators are gone. We now use a Pair as a pattern to
-get the same effect:
+The filetest operators are gone. We now use a Pair as either a
+pattern or a method name to get the same effect:

if $filename ~~ :e { say "exists" }
+ if $filename.:e { say "exists" }

-These tests may be combined via junctions:
+Both of these forms actually translate to
+
+ if $filename.TEST(:e) { say "exists" }
+
+which which is a generic mechanism that dispatches to the object's
+class to find the definition of C<TEST>. (It just happens that C<Str>
+(filenames) and C<IO> (filehandles) default to the expected filetest
+semantics, but C<$regex.:i> might tell you whether the regex is case
+insensitive, for instance.)
+
+Using the pattern form, multiple tests may be combined via junctions:

given $handle {
when all :r :w :x {...}
@@ -1421,14 +1432,24 @@
when * {...}
}

+The advantage of the method form is that it can be used in places that
+require tighter precedence than C<~~> provides:
+
+ sort { $^a.:M <=> $^b.:M }, @files
+
+though that's a silly example since you could just write:
+
+ sort { .:M }, @files
+
+But that demonstrates the other advantage of the method form.
+
In general, the user need not worry about caching the stat buffer.
-The stat buffer will automatically be reused if the same object is
-queried and the stat buffer has not "expired", where that is defined
-as older than a second or so. If this is a concern, an explicit stat()
-or lstat() will automatically reset the stat buffer, as will switching
-to a different filename or handle.
+The stat buffer will automatically be reused if the same object has
+recently been queried, where "recently" is defined as less than a
+second or so. If this is a concern, an explicit stat() or lstat()
+on that file will automatically reset the stat buffer for that file.

-Note that C<$file ~~ :s> still returns the filesize, but C<:!s> is true
+Note that C<:s> still returns the filesize, but C<:!s> is true
only if the file is of size 0.

=item *
@@ -1832,10 +1853,14 @@

Junctions are specifically unordered. So if you say

- for all(@foo) {...}
+ foo() | bar() | baz() == 42

-it indicates to the compiler that there is no coupling between loop
-iterations and they can be run in any order or even in parallel. XXX bogus
+it indicates to the compiler that there is no coupling between
+the junctional arguments. They can be evaluated in any order or in
+parallel. They can short-circuit as soon as any of them return 42,
+and not run the others at all. Or if running in parallel, the first
+successful thread may terminate the other threads abruptly. In general
+you probably want to avoid code with side effects in junctions.

Use of negative operators with syntactically recognizable junctions may
produce a warning on code that works differently in English than in Perl.

Modified: doc/trunk/design/syn/S12.pod
==============================================================================
--- doc/trunk/design/syn/S12.pod (original)
+++ doc/trunk/design/syn/S12.pod Fri Feb 2 01:07:36 2007
@@ -12,9 +12,9 @@

Maintainer: Larry Wall <la...@wall.org>
Date: 27 Oct 2004
- Last Modified: 1 Feb 2007
+ Last Modified: 2 Feb 2007
Number: 12
- Version: 36
+ Version: 37

=head1 Overview

@@ -607,6 +607,27 @@

my Dog $spot .= new(:tail<LONG> :legs<SHORT>);

+=head1 Pair query methods
+
+Certain classes such as filehandles allow colon pairs to be used as if they
+were methods. When you say:
+
+ $filehandle.:e
+ $filehandle.:!x
+
+it actually calls
+
+ $filehandle.TEST(:e)
+ $filehandle.TEST(:!x)
+
+which is expected to return a value that can be used as a boolean.
+While this is primarily intended for use by file tests, other classes
+may define a C<TEST> method to provide a similar mechanism for interrogating
+lightweight properties without having to define methods for all of them.
+(Note, though, that I<all> such queries are answered by the first located
+C<TEST> method--they are not inherited independently. The C<TEST> method
+must explicitly pass the query on to other classes in such cases.)
+
=head1 Calling sets of methods

For any method name, there may be some number of candidate methods

Smylers

unread,
Feb 2, 2007, 3:06:56 PM2/2/07
to perl6-l...@perl.org
la...@cvs.perl.org writes:

> +++ doc/trunk/design/syn/S03.pod Fri Feb 2 01:07:36 2007
>

> if $filename ~~ :e { say "exists" }
> + if $filename.:e { say "exists" }
>

> +Both of these forms actually translate to
> +
> + if $filename.TEST(:e) { say "exists" }

Hey, that looks good.

I've got a slight concern over the name C<TEST> though. The Perl QA
folk already seem to have enough trouble coming up with enough
permutations of "test", "tests", "Test", "TEST", and so on for labelling
tests, test frameworks, and things that relate to testing. Which this
isn't.

(But I have't got a suggestion for a better name.)

Smylers

Larry Wall

unread,
Feb 2, 2007, 5:52:01 PM2/2/07
to perl6-l...@perl.org
On Fri, Feb 02, 2007 at 08:06:56PM +0000, Smylers wrote:
: I've got a slight concern over the name C<TEST> though. The Perl QA

: folk already seem to have enough trouble coming up with enough
: permutations of "test", "tests", "Test", "TEST", and so on for labelling
: tests, test frameworks, and things that relate to testing. Which this
: isn't.

Hmm, TEST doesn't work all that well to describe .:delete{$key} either.

: (But I have't got a suggestion for a better name.)

.OPT
.ALT
.TRY
.MAYBE
.WHEN
.WHETHER
.ASK
.QUERY
.STATUS
.PAIR
.ADV

I think I like STATUS the best at the moment. But I can just imagine
some coding standard mandating that it must be written:

if not STATUS "/tmp/foo": :r { die; }

Larry

0 new messages