21. Advanced Features
Sisal has a number of other features which deserve mention here, even though detailed description of them is beyond the scope of this tutorial. We will briefly describe several of them, and give a reference to a document or person to use as a source for further information.
21.1 Union Types
In order to produce data structures that can take on a recursive structure, such as lists and trees, it is necessary that Sisal have a data structuring ability equivalent to Pascal's variant records. Sisal's equivalent of this is the Union Type; it allows multiple forms of data to occur under a single type, identified by a tag that can be tested by user code. This allows, for instance, a tree to be constructed of a union type consisting of internal nodes or leaf nodes. For more information on Union Types, see the Sisal Language Manual .
Sisal includes a data type that allows producers and consumers of information to execute simultaneously on a shared structure, called a Stream. Streams are homogeneous aggregates, like arrays, except that they can be accessed only for their first element or all but their first element. This allows the construction of programs that operate on continuous values to or from other programs or outside environments. For more information on Streams, see the Sisal Language Manual .
Debugging functional programs, despite the tendency to make fewer mistakes in composing them, tends to be somewhat difficult, mainly because functional language semantics makes input and output difficult, at best. However, we have developed a state-of-the-art symbolic debugging system, incorporating its own compiler and graph interpreter. This debugging system is called Twine, and it is supported as an experimental tool. For more information on Twine, see .
21.4 Mixed Language Programming
It is possible to merge programs in Fortran or C with Sisal code, in order to best use the features of each language, via a facility called the Foreign Language Interface. For instance, Sisal can be used to exploit parallelism in an algorithm, while the imperative languages can be used for I/O or access to special purpose libraries. For more information on mixed language programming and the Foreign Language Interface, see 
21.5 Distributed Memory Sisal
The currently available version of the Optimizing Sisal Compiler (OSC) and Runtime System support parallelism only on computer systems having a shared memory programming model. These include such common computers as multiprocessor Sparcs, SGI's, Crays, and even a few machines with physically distributed memory that can be used in a shared address space mode, such as the BBN TC-2000, nCube, and Encore Multimax. However, prototype versions of Sisal exist for machines with only distributed memory programming models, such as the Thinking Machines CM-5 and Cray T3D. For more information on Distributed Memory Sisal, see .