Author: larry
Date: Fri Apr 13 10:02:01 2007
New Revision: 14372
Modified:
doc/trunk/design/syn/S03.pod
Log:
Clarification of simplified return values of filetests for brian.d.foy++.
Modified: doc/trunk/design/syn/S03.pod
==============================================================================
--- doc/trunk/design/syn/S03.pod (original)
+++ doc/trunk/design/syn/S03.pod Fri Apr 13 10:02:01 2007
@@ -12,9 +12,9 @@
Maintainer: Larry Wall <[EMAIL PROTECTED]>
Date: 8 Mar 2004
- Last Modified: 16 Mar 2007
+ Last Modified: 13 Apr 2007
Number: 3
- Version: 110
+ Version: 111
=head1 Overview
@@ -1477,30 +1477,36 @@
=item *
-The filetest operators are gone. We now use a Pair as either a
+The filetest operators are gone. We now use a C<Pair> as either a
pattern or a method name to get the same effect:
if $filename ~~ :e { say "exists" }
if $filename.:e { say "exists" }
-Both of these forms actually translate to
-
- if $filename.STATUS(:e) { say "exists" }
-
-which is a generic mechanism that dispatches to the object's
-class to find the definition of C<STATUS>. (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.)
+The 1st form actually translates to the latter form, so the object's
+class decides how to dispatch pair methods. It just happens that
+C<Str> (filenames), C<IO> (filehandles), and C<Statbuf> (stat buffers)
+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 {...}
+ when :r & :w & :x {...}
when :!w | :!x {...}
when * {...}
}
+When adverbial pairs are stacked into one term, it is assumed they are
+ANDed together, so
+
+ when :r :w :x
+
+is equivalent to either of:
+
+ when :r & :w & :x
+ when all(:r,:w,:x)
+
The advantage of the method form is that it can be used in places that
require tighter precedence than C<~~> provides:
@@ -1510,13 +1516,23 @@
sort { .:M }, @files
-But that demonstrates the other advantage of the method form.
+But that demonstrates the other advantage of the method form, which is
+that it allows the "unary dot" syntax to test the current topic.
+
+Unlike in earlier versions of Perl 6, these filetests do not return
+stat buffers, but simple scalars of type C<Bool>, C<Int>, or C<Num>.
-In general, the user need not worry about caching the stat buffer.
-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.
+In general, the user need not worry about caching the stat buffer
+when a filename is queried. 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() may be used to return an explicit stat
+buffer object that will not be subject to timeout, and may be tested
+repeatedly just as a filename or handle can. A C<Statbuf> object has
+a C<.file> method that can be queried for its filename (if known);
+the C<.io> method returns the handle (if known). If the C<Statbuf>
+object doesn't know its filename but does know its IO handle, then
+C<.file> attempts to return C<.io.file>.
Note that C<:s> still returns the filesize, but C<:!s> is true
only if the file is of size 0.