Input from UNIX files etc. 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. 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 obtain information 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. Implementation Restriction `read', `filemode', `getenv', and `system' all require their argument to be at most 1024 characters long. Note on system reading functions and referential transparency 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.