On Tue, Jul 13, 2004 at 09:25:52PM +0200, Juerd wrote:
: Luke Palmer skribis 2004-07-13 7:24 (-0600):
: > But in Perl 6, you don't have to specify things like that through the
: > mode string: you can specify them through named parameters:
: > my $fh = open ">$filename" :excl;
:
: I was hoping we could finally get rid of mode characters, and especially
: combined mode and filename in one argument.
The combined form is definitely problematic in various ways, and we haven't
really redesigned open yet, since we haven't got to A29 yet. :-)
We could mandate the two argument form. Or we could decide that "open"
is one of those overly general concepts, and separate things by name:
my $fh = open $filename :excl;
my $fh = append $filename :excl;
my $fh = creat $filename :excl;
...er, I mean,
my $fh = create $filename :excl;
Of course, append and create might just be shorthand for a normal open
with a :create or :append arguments, I suppose. Similar considerations
apply for piped commands, though what the appropriate words might be,
I don't know offhand.
Another interesting question is how well those things read in code like this:
@lines = <open $infile>;
print (append $outfile): @lines;
Or equivalently:
<open $infile> ==>
print (append $outfile):
But that might be a little too concise for good error messages. And they
might lead people to write things like
while <open $file> {...}
which wouldn't necessarily work. At first blush, I'd expect that
to reopen $file every time through the loop, which is probably not
what the user expects. Possibly <...> in scalar context is smart
enough to cache its iterator, but then you start getting into the
"return false once" syndrome that confuses people. The inside of
<...> isn't really a closure. So maybe <...> is smart about closures:
while <{open $file}> {...}
and only calls its closure after its previous iterator is exhausted.
On the other hand, iterators tend to *look* like closures anyway,
so may that'll be hard to distinguish in the absence of a declared
return type.
But I digress...
: Ever since I read about the new :pairs, I thought that would imply :rw
: instead of >.
But :rw is more or less orthogonal to < and > in UnixThink. The fact
that you want to both read and write a file says nothing about whether
you initially want to use, clobber, or append to an existing file.
Larry