|[ < ]||[ > ]||[ << ]||[ Up ]||[ >> ]||[Top]||[Contents]||[Index]||[ ? ]|
Since files and strings are both sequences of characters, it is reasonable to use the same operations for both. But we need to distinguish files from file names, just as we distinguish identifiers from the values they evaluate to. Q uses the prefix `./' to indicate a filename, which evaluates to a file "object":
./Makefile # The file named Makefile.
Q1> :fname="Makefile" Q2> ./$fname # Same as ./Makefile
Q follows the emacs convention that two consecutive `/' means to go to root:
.//etc/passwd # The file name /etc/passwd
A filename object is a sequence (string) variable, so all generic sequence operations are applicable:
Q1> [2 3 4] 1 # Indexing 3 Q2> "xyz" 1 y Q3> ./Makefile Q.tar.Z: tar -v -cf - -X non-tared mi doc unix/Makefile Qlink test \ Makefile non-tared|compress -c>Q.tar.Z Q4> ./Makefile 1 . Q5> size [3 4 5] 3 Q6> size "xyz" 3 Q7> size ./Makefile 110 Q8> # Reversing Makefile: Q9> sprintf "%s\n" (./Makefile (109 downto 0)) Z.rat.Q>c- sserpmoc|derat-non elifekaM \ tset knilQ elifekaM/xinu cod im derat-non X- - fc- v- rat :Z.rat.Q
Filenames can be used for assignment:
Q10> ./foo := ./Makefile
./foocan name a non-existing file.
A filename that names a directory is viewed as an associative mapping from names to other filenames.
Q11> sprintf "%#s\n" ./unix ./unix Q12> sprintf "%#s\n" (./unix "Makefile") ./unix/Makefile Q13> # Can also use a filename as an "index": Q14> sprintf "%#s\n" (./unix ./Makefile) ./unix/Makefile Q15> sprintf "%#s\n" (. "/etc/passwd") .//etc/passwd Q16> size (. "/etc/passwd") 759 Q17> wc /etc/passwd 14 30 759 /etc/passwd
Compare the Unix process environment, which is also represented as an associative mapping, except in this case each name is mapped to a string:
Q18> env "TERM" xterm Q19> size env 18 Q20> env "FOO" := "/etc/foo" Q21> size env 19 Q22> env "FOO" /etc/foo
As a convenience, Q will assume that an identifier is
a filename, even without a `./' prefix, if there
exists a file with that name, and no other binding for
that name is in scope. Thus
normally work as well as
Also, a word that begins with `/' is treated
as an absolute filename. (Just `/' by itself
is the division operator.) A word that begins with
an existing directory name followed by `/'
is also a filename.
These conventions work well, but may be modified or
removed if it turns out they are too complicated or
error prone. There are some complications
/ is also used for division.
a divided by
is defined. Otherwise,
a/b is a filename if
is a directory (that exists at compile time). Otherwise,
a/b is an error.
|[ << ]||[ >> ]||[Top]||[Contents]||[Index]||[ ? ]|