Annotation of researchv10no/cmd/sml/doc/refman/module.tex, revision 1.1.1.1

1.1       root        1: \chapter{Modules}
                      2: ML provides a powerful module system, which can be used to partition
                      3: programs along clean interfaces.
                      4: 
                      5: \section{Structures}
                      6: 
                      7: In its simplest form, a module is
                      8: (syntactically) just a collection of declarations viewed as a unit,
                      9: or (semantically) the environment defined by those definitions.
                     10: This is one form  of a {\em structure--expression}:
                     11: \verb"struct"~dec~\verb"end".  For example, the following structure--expression represents an implementation of stacks:
                     12: \begin{verbatim}
                     13: struct
                     14:    datatype 'a stack = Empty | Push of 'a * 'a stack
                     15:    exception Pop and Top
                     16:    fun empty(Empty) = true | empty _ = false
                     17:    val push = Push
                     18:    fun pop(Push(v,s)) = s | pop(Empty) = raise Pop
                     19:    fun top(Push(v,s)) = v | top(Empty) = raise Top
                     20: end
                     21: \end{verbatim}
                     22: Structure--expressions and ordinary expressions are distinct classes;
                     23: structure--expressions may be bound using the \verb"structure"
                     24: keyword to structure--names, while ordinary expressions are
                     25: bound using \verb"val" to value--variables.
                     26: The form of a \verb"structure" binding is as follows:
                     27: \begin{quote}
                     28: \verb"structure" name \verb"=" structure--expression
                     29: \end{quote}
                     30: Thus, we might make a structure Stack using the structure--expression
                     31: shown above:
                     32: \begin{verbatim}
                     33: structure Stack = struct
                     34:                     datatype . . .
                     35:                     exception . . .
                     36:                      . . .
                     37:                   end
                     38: \end{verbatim}
                     39: 
                     40: The environment $E$ that binds the identifiers \verb"stack",
                     41: \verb"Pop", \verb"empty", etc. is now itself bound to the
                     42: structure--identifier \verb"Stack".  To refer to names in $E$, {\em
                     43: qualified identifiers} must be used.  A qualified identifier consists
                     44: of a structure--name, a dot, and the name of a structure component,
                     45: e.g. \verb"Stack.empty" (a value), \verb"Stack.stack" (a type),
                     46: \verb"Stack.Pop" (an exception), etc.
                     47: 
                     48: {\bf Structure closure:}  In order to isolate the interface between a
                     49: structure and its context, a \verb"struct" phrase is not allowed to
                     50: contain global references to types, values, or exceptions, except for
                     51: pervasive primitives of the language like \verb"int", \verb"nil",
                     52: etc.  It can, however, contain global references to other structures,
                     53: signatures, and functors, including qualified names referring to
                     54: compenents (values, types, etc.) of other structures.
                     55: 
                     56: There are three forms of structure-expression:
                     57: \begin{enumerate}
                     58: \item An environment enclosed in \verb"struct" ... \verb"end" (as
                     59: above),
                     60: 
                     61: \item An identifer that has been previously bound in a
                     62: \verb"structure" declaration, and
                     63: 
                     64: \item A functor application \verb"F("{\it str}\verb")", where
                     65: \verb"F" is the name of a functor and {\it str} is a structure
                     66: expression.
                     67: \end{enumerate}
                     68: Thus, the declaration \verb"structure~Pushdown~=~Stack" binds the
                     69: name \verb"Pushdown" to the same structure that \verb"Stack" is bound
                     70: to; here, \verb"Stack" is an example of the second kind of structure
                     71: expression.
                     72: 
                     73: \subsection{Accessing structure components}
                     74: The bindings making up a structure define named {\em components} of
                     75: the structure, as in a record.  To refer to such components we use
                     76: qualified names, which are formed by appending a period followed by a
                     77: component name to the name of a structure.  For instance,
                     78: \verb"Stack.empty" refers to the function \verb"empty" defined in the
                     79: structure \verb"Stack".  If the qualified name designates a
                     80: substructure of a structure, then it too has components; {\em e.g.}
                     81: \verb"A.B.x" denotes the component \verb"x" of the substructure
                     82: \verb"B" of a structure \verb"A".
                     83: 
                     84: Qualifiers can be attached only to names; they do not apply to other
                     85: forms of structure expressions.  Qualified names are treated as
                     86: single lexical units; the dot is not an infix operator.
                     87: 
                     88: Direct access to the bindings of a structure is provided by the
                     89: \verb"open" declaration, which is analagous to the ``with'' clause of
                     90: Pascal.  For example, in the scope (determined in the usual way) of
                     91: the declaration
                     92: \begin{quote}
                     93: \verb"open Stack"
                     94: \end{quote}
                     95: the names \verb"stack", \verb"empty", \verb"pop", etc. refer to the
                     96: corresponding components of the \verb"Stack" structure.  It is as
                     97: though the body of the structure definition had been inserted in the
                     98: program at that point, except that the bindings are not recreated,
                     99: but are instead simply ``borrowed'' from the opened structure.
                    100: \verb"open" declarations follow the usual rules for visibility, so
                    101: that if \verb"A" and \verb"B" are two structures containing a binding
                    102: for \verb"x" (of the same flavor, of course), then after opening both
                    103: \verb"A" and \verb"B" with the declaration
                    104: \begin{quote}
                    105: \verb"open A" \\
                    106: \verb"open B"
                    107: \end{quote}
                    108: the unqualified identifier \verb"x"  will be equivalent to
                    109: \verb"B.x".  The \verb"x" component of \verb"A" can still be referred
                    110: to as \verb"A.x", unless \verb"B" also contains a substructure named
                    111: \verb"A".
                    112: 
                    113: Qualified identifiers do not have infix status.  If \verb"+" is
                    114: declared infix in a structure \verb"A", the qualified identifier
                    115: \verb"A.+" is not an infix identifier.  However, when an identifier
                    116: is made visible by opening a structure, it retains its infix status,
                    117: if any.  AMBIGUOUS.
                    118: 
                    119: The declaration \verb"open A B C" is equivalent to \verb"open A; open
                    120: B; open C".
                    121: 
                    122: \subsection{Evaluating structure expressions}
                    123: The evaluation of a structure expression {\em str} depends on its
                    124: form, and assumes a current structure environment $SE$ that binds
                    125: structures and functors to names.  Informally, evaluation proceeds as
                    126: follows:
                    127: \begin{enumerate}
                    128: \item If {\em str} is an encapsulated declaration ({\it i.e.}
                    129: \verb"struct"...\verb"end"), then the body declarations are evaluated
                    130: relative to $SE$ and the {\em pervasive} value, exception, and type
                    131: environments of ML (that is, the environments binding the built-in
                    132: primitives of the language).  The resulting environment is packaged
                    133: as a structure and returned.  The evaluation of value bindings may
                    134: have an effect on the store (the mapping of references to contents);
                    135: the new store is returned as well, to be used in subsequent
                    136: expression evaluations.
                    137: 
                    138: \item If {\em str} is a simple name, then its binding in $SE$ is
                    139: returned.  If it is qualified name, then it is used as an access path
                    140: starting with $SE$ and the designated substructure is returned.
                    141: 
                    142: \item If {\em str} is a functor application
                    143: \verb"F("~$str'$~\verb")", where the functor \verb"F" is declared
                    144: by \verb"functor F ( A ) = "~$body$,
                    145: the parameter structure $str'$ is
                    146: evaluated in $SE$ yielding structure $s_1$; then the ``body'' of the
                    147: definition of \verb"M", which is a structure expression, is evaluated
                    148: in $SE+\{A \mapsto s_1 \}$.  In other words, functor applications are
                    149: evaluated in a conventional call-by-value fashion.
                    150: \end{enumerate}
                    151: 
                    152: \subsection{Evaluating structure declarations}
                    153: To evaluate  a simple structure declaration, one evaluates the
                    154: defining structure expression in the current environment $SE$ and
                    155: returns the binding of the name of the left hand side to the
                    156: resulting structure.  If evaluation of a structure expression raises
                    157: an (untrapped) exception, then the declaration has no effect.
                    158: 
                    159: \subsection{Structure equivalence}
                    160: For certain purposes, such as checking sharing constraints
                    161: (Section~\ref{sharing}) we must be able to determine whether two
                    162: (references to) structures are equal or ``the same.''  Here
                    163: structures are treated somewhat like datatypes; each evaluation of an
                    164: encapsulated declaration or functor application creates a distinct
                    165: new structure, and all references to this structure are considered
                    166: equal.  Thus after the following declarations:
                    167: \begin{verbatim}
                    168: structure S1 = struct ... end
                    169: structure S2 = S1
                    170: structure S3 = struct val x = 4 end
                    171: structure S4 = struct val x = 4 end
                    172: \end{verbatim}
                    173: the names \verb"S1" and \verb"S2" refer to the same structure and are
                    174: ``equal,'' whereas \verb"S3" and \verb"S4" are different structures
                    175: and are not equal, even though the right-hand-sides are identical.
                    176: 
                    177: \section{Signatures}
                    178: It is often useful to explicitly constrain a structure binding to
                    179: limit the visibility of its fields.  This is done with a {\em
                    180: signature}, which is to a structure binding as a type constraint is to a
                    181: value binding.  For example, we might write a signature for the
                    182: \verb"Stack" module as
                    183: \begin{verbatim}
                    184:    sig type 'a stack
                    185:        exception Pop and Top
                    186:        val Empty : 'a stack
                    187:        val push : 'a * 'a stack -> 'a stack
                    188:        val empty : 'a stack -> bool
                    189:        val pop : 'a stack -> 'a stack
                    190:        val top : 'a stack -> 'a
                    191:    end
                    192: \end{verbatim}
                    193: The signature mentions the structure components that will be visible
                    194: outside the structure.
                    195: 
                    196: Signatures may be bound to identifiers by a signature declaration,
                    197: \begin{quote}
                    198: \verb"signature" {\it sig-Id} \verb"=" {\it sig-expr}
                    199: \end{quote}
                    200: where {\it sig-Id} is an identifier and {\it sig-expr} is a signature
                    201: expression---either a \verb"sig"...\verb"end" phrase or a previously
                    202: bound signature identifier.  Thus, the signature above could be bound
                    203: to the identifier \verb"STACK" by the declaration
                    204: \begin{verbatim}
                    205: signature STACK =
                    206:    sig type 'a stack
                    207:        exception Pop and Top
                    208:        . . .
                    209:    end
                    210: \end{verbatim}
                    211: 
                    212: A signature can be used to constrain a structure by including it in a
                    213: structure declaration:
                    214: \begin{quote}
                    215: \verb"structure" {\it str-id} \verb":" {\it sig-expr} \verb"=" {\it str}
                    216: \end{quote}
                    217: For example, we could write
                    218: \begin{verbatim}
                    219: structure Stack1 : STACK = Stack
                    220: \end{verbatim}
                    221: Now the constructor \verb"Push" is not a visible component of the
                    222: \verb"Stack1" structure, since it doesn't appear in the signature;
                    223: the qualified identifier \verb"Stack1.Push" is erroneous.
                    224: Furthermore, since \verb"stack" is mentioned in the signature only as
                    225: a \verb"type" constructor and not as a \verb"datatype" constructor,
                    226: the identifier \verb"Stack1.stack" is usable as a type but not a datatype.
                    227: Finally, since the constructor \verb"Empty" is mentioned as a
                    228: \verb"val" in the signature, but not as a constructor ({\it i.e.} as
                    229: part of a datatype specification), then \verb"Stack1.Empty" may be
                    230: applied as a function but not matched in a pattern.
                    231: 
                    232: There are many signatures that can match the structure \verb"Stack".
                    233: One of the ``broadest'' is
                    234: \begin{verbatim}
                    235: structure Stack2 : sig
                    236:                       datatype 'a stack = Empty | Push of 'a * 'a stack
                    237:                       exception Pop and Top
                    238:                       val empty : 'a stack -> bool
                    239:                       val push : 'a * 'a stack -> 'a stack
                    240:                       val pop : 'a stack -> 'a stack
                    241:                       val top : 'a stack -> 'a
                    242:                   end
                    243:                = Stack
                    244: \end{verbatim}
                    245: and the ``narrowest'' is
                    246: \begin{verbatim}
                    247: structure Stack3 : sig end = Stack
                    248: \end{verbatim}
                    249: Now, the structure \verb"Stack2" is equivalent to \verb"Stack"; it is
                    250: the ``same'' structure, and all the same fields are visible.  The
                    251: structure \verb"Stack3" has no components; there are no qualified
                    252: identifiers beginning with \verb"Stack3."  However, \verb"Stack3" is
                    253: the ``same'' for structure-equivalence purposes as \verb"Stack",
                    254: \verb"Stack1", and \verb"Stack2"; signature constraints do not change
                    255: the identity of a structure, just which fields are visible.
                    256: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.