List is a built-in type-producing function. It provides linear lists consisting of elements of the argument type. Its signature is: List: func[t:type{}] type l { New; :=; V; '' : func[] val l (*empty list*); is_nil : func[val l] val Boolean (* is empty *); cons: func[val t; val l] val l; (* add at left end *); ^* : func[val l; val t] val l; (* cons, with args reversed *); head: func[val l] val t (* first element, error if empty *); tail: func[val l] val l (* all but first, error if empty *); } (New initializes to nil, denoted by ''.) The List function is provided only for convenience and implementation efficiency; it can easily be implemented within Russell. The reverse cons operation ^* exists only for historical reasons; its use is discouraged. The New function initializes to the empty list (''[]). In addition to the built-in List function, an overloaded polymorphic cons function is defined in the initial environment as: ^ == func[x: val T; y: val List[T]; T: type{}] { cons[x,y]; }; ^ == func[x: val T; y: val T; T: type{}] { cons[x, cons[y, (List[T])$'']]; }; Recalling that "^" is right associative, this makes it possible to write the list with elements 1, 2, and 3 as "1 ^ 2 ^ 3" without further type specification or other baroque syntax. This allows a convenient syntax for procedures with a variable number of arguments of uniform type. Implementation Note: The non-Vax versions of the compiler with the -O flag insure that "^" actually compiles to in-line code, involving no procedure calls.