On Sun, Apr 15, 2007 at 01:16:32PM -0400, John Macdonald wrote: : On Fri, Apr 13, 2007 at 08:14:42PM -0700, Geoffrey Broadwell wrote: : > [...] -- so non-dwimmy open : > variants are a good idea to keep around. : > : > This could be as simple as 'open(:!dwim)' I guess, or whatever the : > negated boolean adverb syntax is these days .... : : open(:file), open(:dir), open(:url), ... could be the non-dwimmy : versions. If you don't specify an explicit non-dwimmy base : variant, the dwim magic makes a (preferrably appropriate) choice.
I suspect that since we have a type system now we should probably use it for the non-dwimmy versions. my $io = IO::File.open($str) my $io = IO::Pipe.open($str) my $io = IO::Socket.open($str) my $io = IO::Dir.open($str) my $io = IO::URI.open($str) etc. And of course different kinds of objects can have different defaults. I'd guess the default for directories is to take a snapshot and sort the entries, for instance. Certainly the open is the only place we have to distinguish the type, and $io.close will close any of them. To me the interesting question is, when do we assume that a string is a filename or uri? I can argue that for historical and security reasons bare open() should always assume the provided string is a normal filename. However, given that the existence of feed operators removes most of my objections to Ingy's io() interface, we could make that default to uri processing: io('http://www.wall.org/~larry') ==> my @homepage; Though we have a bit of a semantic problem insofar as @source ==> io('file:foo') is going to want to supply more arguments to io() rather than send the feed to some method of the IO object, unless io() is some kind of a context-sensitive macro, or at least has a signature that doesn't allow slurpies. And currently feed ops are considered statement terminators, which makes it odd to think about overloading them. More of a problem is that multiple dispatch based on argument type depends on eager evaluation of dynamic types, while feeds are basically lazy. We don't know how "hard" to call io() without recognizing it as special, or specifying the actual method: @source ==> io('file:foo').print Maybe that's good enough, but it seems like we could do a little better. Hmm, type coercions tend to be unary, or at least not "listy", so maybe we can just recognize types as returning source and sink objects, which feeds automatically call with an appropriate variadic method (.lines, .print, .tap) depending on pointiness: IO('http://www.wall.org/~larry') ==> my @homepage; # implicit .lines @source ==> IO('file:foo') # implicit .print @source ==> IO($debuglog) ==> @sink # implicit .tap Larry