On Fri, May 06, 2005 at 08:19:05AM -0400, Aaron Sherman wrote: : "open" as a verb is extremely ambiguous. In dictionary searches I see as : many as 19 definitions just for the verb form.
Well, sure, but also need to take Perl history into account, where dwimmy open is considered something of a liability. I think the dwimminess of open() probably arises only from MMD, and a string or array of string in the first argument implies ordinary file open. That means perhaps we have open uri($x) to type $x to a \w+: handled string, so MMD can see it. When means you can pass a uri object to a generic open just fine, as long as your program generates the type. But random strings wouldn't accidentally trigger uri processing. Alternately, open URI: $x will single dispatch to the URI class. : "open" as a POSIX function is not ambiguous at all. But will the POSIX : model be the model on which P6 is based (as P5 was), or will the POSIX : model simply be one of many models supported by open and other : built-ins? One of many. : I think that it's fair to say that Perl has grown beyond POSIX. If it : also presents the URI model, that's not all bad, is it? As long as it's not the accidental default. : Same goes for the Unix command-line conventions (e.g. cat's "-" special : filename). I should be able to request a "pure POSIX" open, but I'm not : sure it should be the default for one of English's most powerfully : flexible verbs. io() is probably the place for complete dwimmery. : > and perhaps even : > : > File::Copy::copy("-","-"); : : This brings up something interesting. If we have: : : sub File::Copy::copy(IO $file1, IO $file2) {...} : : the above doesn't work. : : I think I want: : : sub File::Copy::copy(IO $file1 :r, IO $file2 :w) {...} : : But does that work the way I think it does? Does that end up calling: : : IO.new("-", :r); : : and : : IO.new("-", :w); : : ? If not, how do I ensure that this works correctly? Those are all pretty bletcherous. How 'bout io('-') ==> io('-'); : > Sure enough, there's an easy way: : > : > class IO is ParrotIO does RegisteredStringConstructor {...} : > role RegisteredStringConstructor { : > has %:registry; : > sub register(Any $pattern, Type $type) { : > %:registry{$pattern} = $type; : > } : > multi method new(Str $string,*%rest) { : > for %:registry.keys -> $pat { : > if $string ~~ $pat { : > return %:registry{$pat}.bless(:string($string),*%rest); : > } : > } : : I would need some error handling here, and possibly would need to defer : to a parent as a fallback. : : That brings up the idea of delegation... should this be handled by : delegation instead of the way I've done it? Not sure. I'm still trying : to figure out how to make this scope correctly so that: : : use IO; : { : use IO::URI :open; : open("http://www.perl.org/",:r); : } : open("http://www.perl.org",:r); : : opens two very different things: a socket to a host and port as directed : by a URI vs a file named "www.perl.org" in a directory called "http:". my &open ::= &open:(URI); or maybe some kind of currying. Multiple handlers would need some way of ordering them though. Seems like I put something into the delegation model to deal with that already, like has @:iolist handles <open>; : > Optional export features of IO::* could allow: : > : > * pipeline command execution : > * thread and/or process coupling : > * handle duping : > * much more : > : > Thus, you would control these features like so: : > : > use IO; : > use IO::Funky :register_string_open_funkiness; : > open("funk",:w); : : Which is probably just the tip of the iceberg. You might, for example, : want to lay out a user-defined filesystem, or open database tables as : files, etc. I think lumping everything under the IO rubric is perhaps a mistake, unless we also give shortcuts for all the common cases, in which case maybe we should go for a flatter hierarchy to begin with, and leave the deep names for CPAN modules. : Of course, you can do all of this explicitly through OO syntax, but it : would be nice to uniformly export locator semantics as strings so that : command-line and other string-based user interaction could be made more : powerful with a single "use". Just so easy things stay easy. Foo::Bar::Baz::meth names are not construed by everyone as easy to use. Larry