Timothy S. Nelson wrote:
On Tue, 17 Feb 2009, Richard Hainsworth wrote:

Timothy S. Nelson wrote:
<snip>be specifying our files; it's prettier than File::Spec :), and unified.

    Anyway, HTH,


I like all the default suggestions.

Not sure whether this means you completely agree with me, or completely disagree.

Like == agree
Like !=== agree
It seems to me that a path, whether within a file system or across the internet, leads to a location. A location is a container for files. A file is a container for data.

Given the strong typing paradigm of Perl6, it seems to me that the specification should distinguish between files and locations.
<snip>

I think you're confusing the inside and the outside of files. For me, the inside of a file is everything you can do to it when you've done an open (eg. read and write). The outside of a file is the other stuff (stat, chown, etc).
Interesting. But how is inside/outside different from container/contents ?
Methods on a container are different to methods on the content.
My idea is that a location is a container, file is also a container, but of another sort. I was thinking that by identifying locations as specific types of containers, it would be possible to create an abstraction for perl6 specification that is less OS sensitive.
Let me give you an example. Say I wanted to specify a path to a particular XML element, starting from the root of a filesystem. Say also, for argument's sake, that when the search path came to a file ending in .xml, it would, if there were children requested, read the file and dig through the tree. Then I could do something like this:

/home/wayland/xml/foo.xml/html/head/title/text()
Also there is the case of archived directories and files, eg.
/home/richard/archive/version2.zip/foo/text.txt

Version2.zip is considered by the OS as a file.
Note that the directory called "xml" doesn't contain the file called "foo.xml". Instead, it contains a filesystem entry called "foo.xml". This filesystem entry in turn points to the contents (which I look at with an XML path).

In other words, note the distinction between the *contents* of the file, and the entry in the file system that refers to it. Which is the file? Colloquially, both, but I'd argue that technically, the file is the *contents*, not the filesystem entry.
Well, even here, <html> <head> and <title> all define conceptual containers within the marked up datastream. But the datastream is defined as a string of octets, and in this example, the initial string with something like

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

has been ignored in your example. So it is not the perl6 core that is allowing path definition to an html fragment.

For example, it is sensible to have a .files() method for a directory, but it is not sensible for such a method to exist for a file. Meanwhile, print/say/putc are not sensible for a directory/location.
So I was not entirely right in saying .files has no meaning for a file, if the file is a zip archive. But both can be considered locations, even though for unix/windows a zip file is considered a file.

But isnt that a feature of the OS?
    I'd argue that we want three things here, if we go down this path:

IO::Dir.files()
IO::FileNode.lines()
IO::File.printf()

No I dont think so. There is a difference between a source of data and data. For example, suppose we set up a connection to a database that generates multiple lines and we associate (I am guessing about the syntax here) the data base response with a filehandle my $fh = $database.connect('select "Month","Name", "Capital", "Total_Assets" from "Banks" where id "month" > "20071201" ');
for =$fh -> @record {...};

The data stream is in lines, but the source is not a file. Yet supposing, the same data had been saved to a file and $fh had been associated with the file as a source. As far as the code in the for loop is concerned, it is the same data stream.

But the data stream generated from querying a location where a number of files are located in a filestore is different from the datastream from file.
However, it seems to me that maybe the .files() method is heading in the direction of PHPs 1001 string functions. It might be better like this:

$dir = new IO::Dir("/home/wayland");
@files = grep { -f } @$dir;
But this is exactly what I think should be avoided. -f implies that the location $dir contains things other than files. But that is an artifact of the OS and should be hidden within the implementation of perl, or made available by a OS-specific package.

When I started learning perl (I used Windows platform at that time) I was confronted with a bewildering array of functionality. Some was part of perl and I could use, nearly all the IO functions were specific to Unix, and I never ever used. But I spent a considerable amount of time working out what was and wasnt useful to me at the time.


I know @$dir is bad perl6, but I hope you'll take the idea, in that, when we treat $dir as an array, we get a return of all children, whether files or directories, and then use -f to distinguish between them. Btw, the object creation line above could be done differently -- don't anyone get hung up on that.

Moreover, if perl6 distinguishes between a location and a file, then the spec can distinguish between a .children() method that provides a list of child locations (viz., sub-directories) and .files(), which provides a list of the contents of the location.

Keep in mind that files and directories are also not the only things in a filesystem. There are links, devices, pipes, and others to worry about. Which is why I prefer my solution.

    :)

Yet links, devices, pipes, etc are OS-related artifacts. Even now the internet provides access to locations with datasources. If someone is wholly concerned with data from the internet, eg., web cams and databases, of what interest is a /dev file in a unix filesystem?

---------------------------------------------------------------------
| Name: Tim Nelson                 | Because the Creator is,        |
| E-mail: wayl...@wayland.id.au    | I am                           |
---------------------------------------------------------------------

----BEGIN GEEK CODE BLOCK----
Version 3.12
GCS d+++ s+: a- C++$ U+++$ P+++$ L+++ E- W+ N+ w--- V- PE(+) Y+>++ PGP->+++ R(+) !tv b++ DI++++ D G+ e++>++++ h! y-
-----END GEEK CODE BLOCK-----

Reply via email to