1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
_I_n_p_u_t_ _f_r_o_m_ _U_N_I_X_ _f_i_l_e_s_ _e_t_c_.
The following Miranda functions provide an interface to the UNIX file
system from within Miranda expressions:
read :: [char]->[char]
This takes a string valued argument, which it treats as a UNIX pathname,
and returns the contents of the file or device of that name, also as a
string (i.e. as a list of characters). There is no end-of-file
character, the termination of the file is indicated simply by the end of
the list of characters. The Miranda evaluation terminates with an error
message if the file does not exist or the user does not have read
permission for it.
A special case - the notation `$-' denotes the contents of the standard
input, as a list of characters. Note that multiple occurrences of `$-'
always denote a single shared input stream. So for example ($- ++ $-)
reads one lot of data from the terminal and duplicates it.
(See separate subsection on Input/Output of binary data for the binary
versions readb and $:-)
filemode :: [char]->[char]
Takes a pathname and returns a string representing the access
permissions of the current process to the file of that name. The string
is empty if the file does not exist, otherwise it is of length four
containing, in order, the following characters - 'd' if the file is a
directory, 'r' if it is readable, 'w' if it is writeable, 'x' if it is
executable. Each character not applicable is replaced by '-'. So for
example "drwx" is the filemode of a directory with all access
permissions, while "-rw-" is the filemode of a normal file with read and
write but no execute permission.
getenv :: [char]->[char]
Looks up the string associated with a given name in the current UNIX
environment (see man (2) getenv in the UNIX manual system). For example
getenv "HOME"
returns the name of the current home directory. Returns the empty
string if the given name not present in the environment.
system :: [char]->([char],[char],num)
The effect of `system string' is that a UNIX process is forked off to
execute `string' as a shell command (by `/bin/sh'). The result of the
call to `system' is a triple containing the standard output, error
output, and exit_status, respectively, resulting from the execution of
the UNIX command. (The exit_status of a UNIX command is a number in the
range 0..127, with a non-zero exit status usually indicating some kind
of abnormal event.) Note that inspecting the exit_status will force the
Miranda process to wait until the execution of the shell command has
completed - otherwise the two processes proceed concurrently.
If the attempt to set up a shell process fails, `system' returns the
result ([],errmess,-1), where errmess is an error message.
WARNING - the function `system' provides a very general interface to
UNIX. Obviously, this can be abused to cause the evaluation of a
Miranda expression to have side effects on the state of the filing
system. It is not intended to be used in this way - `system' should be
used only to _o_b_t_a_i_n _i_n_f_o_r_m_a_t_i_o_n about the state of the world. If you
wish to change the state of the world, this should be done by placing a
`System' message in your output list (see next manual section).
Since reading data from the terminal would constitute a side effect, the
background process created by `system' comes into being with its
standard input closed.
_I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _R_e_s_t_r_i_c_t_i_o_n
`read', `filemode', `getenv', and `system' all require their argument
to be at most 1024 characters long.
_N_o_t_e_ _o_n_ _s_y_s_t_e_m_ _r_e_a_d_i_n_g_ _f_u_n_c_t_i_o_n_s_ _a_n_d_ _r_e_f_e_r_e_n_t_i_a_l_ _t_r_a_n_s_p_a_r_e_n_c_y
Although `read', `filemode', `getenv' do not have side effects, they are
not referentially transparent because it cannot be guaranteed that an
expression like
read "file"
will return the same result if evaluated twice. Some external event may
have changed the state of the filing system in the meantime. Clearly
the same problem applies to `system' - consider for example the
expression
system "date"
which gets date-and-time as a string. Evaluating this twice in
succession is unlikely to produce the same result.
Strictly speaking all calls to `read' and the other functions in this
section ought to be evaluated with respect to the state-of-the-world as
it existed before the evaluation of the given Miranda expression
commenced. Otherwise referentially transparent behaviour cannot be
guaranteed. Enforcing this would appear to require, among other things,
taking a copy of the whole filing system before each Miranda
command-level evaluation. For obvious reasons this is not implemented.
|