The implemented language differs from that described in the Informal Description (Cornell TR80-430) primarily in the following respects: 0) Some bugs in the signature calculus have been "fixed". Declaration signature matching no longer involves argument parameter substitution. (This could lead to situations in which it was impossible to write down the signature of an identifier in a declaration.) The export rule for hiding has been replaced by a constraint that any expressions in the resulting signature must themselves be signature correct. 1) The types and functions known in the initial environment bear little resemblance to those described. Only Short (32 bits on a Sun) integers and integers of unbounded size are implemented. Arrays are always indexed by Short. Character strings, Booleans, and Arrays are also provided. Reference types are provided in a simplified form. Lazy and industrious lists are provided, as is a poor implementation of floating point numbers. An interface to UNIX signals is provided. A Callcc primitive resembling that of Scheme is provided. A trace facility is present. These are all described in the corresponding "rhelp" entries. 2) The ValueOf operation has been renamed V. 3) Unions have syntax union local_name { id : type_expression; ... } Their signature has components named New, :=, V, to_id, from_id, is_id, ... Extensions evaluate their "argument". 4) The image construct has been replaced by the Cartesian product constructor prod local_name { id : non_var_signature } Its signature has components New, :=, V, Mk, id, ... 5) The notion of a file system is much closer to UNIX. To preserve the soundness of the signature calculus, there exists a single variable FS with signature var Void. It is a parameter to input operations. Thus all functions which refer to such operations must also have access to a global variable. 6) A facility to interface with C and UNIX has been provided. A function construction may have the form func[param_list; var Void]result_sig { extern "extern_proc_name" } The external procedure name must be complete, that is, it should usually start with an underscore character. Restrictions apply to C routines called in this way. The main ones are: 1) They do not have to be pure functions, since they are forced to take a var Void parameter. They should however respect the parameter and result signatures. It is useful to note that val ChStr ~ char * val Short ~ long (short on a VAX) var Short ~ long * 2) Any references to malloc will get linked to the Russell atomic object allocator (standard malloc on a Sun). This means that objects allocated this way should not contain references to Russell objects, as such references will be hidden to the garbage collector. On the VAX, if such objects themselves are not to be collected, they should be returned to the Russell program, so that they will be found. (It is guaranteed that the garbage collector will not be invoked as a result of calling malloc. Thus it is usually not necessary for C programs to obey Russell conventions about stack contents. The garbage collector has also been hacked so that it should not be confused by stdio stuff.) 7) The compiler tries to infer signature information, selection types, V applications, and 0-ary applications whenever possible. Very little of this is done inside signatures. The basic algorithm used outside signatures is to topologically sort the signature dependency graph for the whole program, and then to do these inferences in topological order. The compiler will either complain or start making guesses if this dependency graph is circular. It should always be possible avoid any resulting error messages by adding explicit signature information. 8) The compiler tries to infer missing arguments to applications. The omitted arguments must correspond to the last formal parameters. This will be successful if 1) They can be inferred by unification of non-type argument and parameter signatures. 2) The parameter type is var Void. (The innermost parameter with this signature is used.) 3) There are three parameters with val signature, and two arguments, both of which are unquoted strings and the name of the operator is '.' The inferred argument will be the length of the second string. (Technically a string which is the decimal representation of the length. Its type will be inferred using the usual approaches.) This makes it possible for small floating point constants to be recognized. 9) Selections in signatures may not refer to overloaded type components. 10) The extern { "..." } construct was added to allow separate compilation of Russell programs.