|
|
1.1 ! root 1: \chapter{Evaluation} ! 2: \label{eval} ! 3: \section{Environments and Values} ! 4: Evaluation of phrases takes place in the presence of an {\em environment} and a ! 5: {\em store}. An {\em value environment} E maps identifiers to values, value constructors, and ! 6: exception constructors. A {\em store} S maps references to values; references ! 7: are themselves values. (Type environments TE, are ! 8: ignored here since they are relevant only to ! 9: type-checking and compilation, not to evaluation. Other environments ! 10: having to do with the module system are also ignored here.) ! 11: ! 12: A value $v$ is either a constant (a nullary constructor), a ! 13: construction (a constructor applied to a value), a record, a ! 14: reference, or a function value. A record value is a set of ! 15: label-value pairs, written \{ label = value , \rep{0} , label = value \}, ! 16: in which the labels are distinct; note that the order of components ! 17: is immaterial. Labels may be identifiers or integer numerals; both ! 18: kinds of labels may appear in the same record value. A function ! 19: value is a partial function which, given a value, may return a ! 20: value or may raise an exception; it may also change the store as a side-effect. ! 21: ! 22: An exception $e$, associated to an exception name {\em exn} in a value ! 23: environment, is a special kind of constructor. Exception ! 24: constructors may be nullary or value-carrying, just as may ordinary ! 25: constructors. Nullary exception constructors, and constructed ! 26: exceptions (exception constructors applied to values), are ordinary ! 27: values of type {\em exn}. ! 28: ! 29: Evaluation of a phrase returns a {\em result}---a value $v$, ! 30: a value-environment $E$, or a store $S$ as follows: ! 31: ! 32: \begin{tabular}{l l} ! 33: {\bf \ \ Phrase}&{\bf \ Value} \\ ! 34: Expression & v and S, or raise(v) and S\\ ! 35: Value binding & E and S, or raise(v) and S\\ ! 36: Type binding & {\it no effect on E or S} \\ ! 37: Datatype binding & E \\ ! 38: Exception binding & E \\ ! 39: Declaration & E and S, or raise(v) and S ! 40: \end{tabular} ! 41: ! 42: The remainder of this chapter describes the semantics of various ! 43: phrases in terms of values $v$ and environments $E$. ! 44: ! 45: The semantics of stores ($S$) are discussed in ! 46: Chapter~\ref{reference}; ! 47: for the remainder of this chapter, the ! 48: effect of various phrases on stores will be ignored. ! 49: The semantics of exceptions is discussed in ! 50: Chapter~\ref{exception}. ! 51: ! 52: ! 53: For every phrase except a \verb"handle" expression, whenever its ! 54: evaluation demands the evaluation of an immediate subphrase which ! 55: returns a raised exception {\em raise(v)} as a result, no further ! 56: evaluation of subphrases occurs and {\em raise(v)} is also the result ! 57: of the phrase. This rule should be remembered while reading the ! 58: evaluation rules below. ! 59: ! 60: In presenting the rules, explicit type ! 61: constraints (:ty) have been ignored since they have no effect on ! 62: evaluation. ! 63: ! 64: \section{Environment manipulation} ! 65: We may write $\{ i_1 \mapsto v_1 , ... , i_n \mapsto v_n \}$ for a ! 66: value environment E (the identifiers $i_k$ being distinct). Then ! 67: $E(i_k)$ denotes $v_k$, $\{\}$ is the empty value environment, and ! 68: $E+E'$ means the environment in which the associations of $E'$ ! 69: supersede those of $E$. ! 70: ! 71: \section{Matching patterns} ! 72: Patterns serve in ML both as formal parameters of functions, and ! 73: as indices in case statements. When a function or a case statement ! 74: is applied to a particular value, one of its patterns may match the ! 75: value. ! 76: ! 77: A nullary constructor (like \verb"nil") used as a pattern ! 78: will match only the corresponding nullary constructor value. A ! 79: value-carrying constructor $c$, applied to a pattern $p_1$, makes a pattern ! 80: $c(p_1)$; ! 81: this constructed pattern will match a value $c(v_1)$ ! 82: built with the same value-carrying constructor, and only if the ! 83: pattern $p_1$ matches the value $v_1$. ! 84: ! 85: A record pattern ! 86: \verb"{" ${\it lab}_1$ \verb"=" ${\it pat}_1$ , \underline{\ \ \ } , ${\it lab}_n$ \verb"=" ${\it pat}_n$ \verb"}" ! 87: matches a record value whose labels are the same, and only if each ! 88: pattern matches the corresponding value. ! 89: If the ellipsis (\verb"...") is used at the end of a record pattern, ! 90: then it will match a record value with {\it at least} the labels ! 91: specified in the pattern. ! 92: ! 93: An identifier (i.e. a variable) ! 94: used as a pattern will match any value; when this happens, the ! 95: variable will also be bound to that value throughout the variable's ! 96: scope. When a variable is a component of a record or constructor ! 97: pattern, then it is bound to a particular component of the record ! 98: value or constructed value. ! 99: ! 100: An underscore will match any value. ! 101: ! 102: Sometimes it is desired to bind a variable to a value only ! 103: if the value matches a particular pattern. The pattern ! 104: {\it id}\verb" as "{\it pat} binds the value to the variable {\it ! 105: id}, but only if the {\it pat} matches. ! 106: ! 107: Type constraints may be applied to patterns. {\it pat\verb":"ty} ! 108: matches the same values that {\it pat} does, but the compiler will ! 109: guarantee that the pattern will only be applied to values of type ! 110: {\it ty}. ! 111: ! 112: \subsection*{A more formal description} ! 113: The matching of a pattern to a value $v$ either {\em fails} or yields ! 114: a value environment. Failure is distinct from raising an exception, ! 115: but an exception will be raised when all patterns fail in applying a ! 116: match to a value (see Sections~\ref{raisematch}, \ref{raisebind}, and \ref{reraise}). In the following rules, if any ! 117: component pattern fails to match then the whole pattern fails to ! 118: match. ! 119: ! 120: The following is the effect of matching a pattern to a value $v$ in the ! 121: environment $E$, for ! 122: each of the kinds of pattern (with failure if any condition is not ! 123: satisfied): ! 124: \begin{description} ! 125: \item[\protect\verb"\_"\hfill] {\it (underscore)} the empty value environment $\{\}$ is ! 126: returned ! 127: \item[id\hfill] if $E(id)$ is not a constructor, then the value environment ! 128: $\{id \mapsto v\}$ is returned ! 129: \item[id\hfill] if $E(id)$ is a nullary constructor, then if $E(id)=v$, ! 130: then $\{\}$ is returned, else failure ! 131: \item[id pat\hfill] if $E(id)$ is a value-carrying constructor $c$, and ! 132: $v = c v'$, then pat is matched to $v'$, else failure. ! 133: \item[id \protect\verb"as" pat\hfill] pat is matched to $v$ returning $E$; ! 134: then $\{id \mapsto v\}+E$ is returned. ! 135: \item[\protect\verb"\{" ${\it lab}_1$ \protect\verb"=" ${\it pat}_1$ , \underline{\ \ \ } , ${\it lab}_n$ \protect\verb"=" ${\it pat}_n$ \protect\verb"\}" \hfill] ! 136: if $v = \{ {\it lab}_1 = v_1 , ... , {\it lab}_n = v_n \}$ then ! 137: ${\it pat}_i$ is matched to $v_i$ returning $E_i$, for each $i$; then ! 138: $E_1 + ... + E_n$ is returned. ! 139: ! 140: \item[\protect\verb"\{" ${\it lab}_1$ \protect\verb"=" ${\it pat}_1$ , \underline{\ \ \ } , ${\it lab}_n$ \protect\verb"=" ${\it pat}_n$ \protect\verb", ... \}" \hfill] ! 141: if $v = \{ {\it lab}'_1 = v_1 , ... , {\it lab}'_m = v_m \}$ then if ! 142: the ${\it lab}_i$ are a subset of the ${\it lab}'_j$ then ! 143: ${\it pat}_i$ is matched to $v_j$ returning $E_i$, for each $i,j$ such that ! 144: ${\it lab}_i = {\it lab}'_j$; then ! 145: $E_1 + ... + E_n$ is returned. ! 146: \end{description} ! 147: No pattern may contain the same variable twice. ! 148: No record pattern, record expression, or record type may use the same ! 149: label twice. ! 150: \section{Applying a match} ! 151: Assume environment $E$. Applying a match ! 152: $ {\it pat}_1 \protect\verb"=>" {\it exp}_1 \mid ... ! 153: \mid {\it pat}_n \protect\verb"=>" {\it exp}_n $ to value $v$ returns a value ! 154: or raises an exception as follows. Each ${\it pat}_i$ is matched to ! 155: $v$ in turn, from left to right, until one succeeds returning $E_i$; ! 156: then ${\it exp}_i$ is evaluated in $E+E_i$. If none succeeds, then ! 157: an exception is raised, depending on the syntactic context in which ! 158: the match occurs (see Sections~\ref{raisematch}, \ref{raisebind}, and \ref{reraise}). ! 159: \label{matchwarn} ! 160: If a match contains a redundant pattern (where any value that could ! 161: satisfy it will be matched by a previous pattern in the match), the ! 162: compiler will issue a warning message. If the match (except those ! 163: that form exception-handlers) is not exhaustive (some value matches ! 164: none of the patterns) then the compiler will issue a warning message. ! 165: ! 166: Thus, for each $E$, a match denotes a function value. ! 167: ! 168: \section{Evaluation of expressions} ! 169: Evaluating an expression in the environment $E$ returns a value (or raises an ! 170: exception) as follows, in each of the cases for exp: ! 171: \begin{description} ! 172: \item[id\hfill] the value $E(id)$ is returned; id may be a variable-id or a ! 173: constructor-id ! 174: \item[const\hfill] the value denoted by the constant (an integer, real, or ! 175: string literal) is returned. ! 176: \item[${\bf exp}_1 {\bf exp}_2$\hfill] ${\bf exp}_1$ is evaluated, ! 177: returning function $f$; then ${\it exp}_2$ ! 178: is evaluated, returning value $v$; then $f(v)$ is returned. ! 179: \item[\protect\verb"\{" ${\it lab}_1$ \protect\verb"=" ${\it exp}_1$ , \underline{\ \ \ } , ${\it lab}_n$ \protect\verb"=" ${\it exp}_n$ \protect\verb"\}" \hfill] ! 180: the ${\it exp}_i$ are evaluated in sequence, from left to right, ! 181: returning $v_i$ respectively; then the record ! 182: $\{ {\it lab}_1 = v_1 , ... , {\it lab}_n = v_n \}$ is returned. ! 183: \item[\protect\verb"raise" exp\hfill] exp is evaluated, returning $v$; then ! 184: the exception-value $v$ is raised. ! 185: ! 186: \item[exp \verb"handle" match\hfill] exp is evaluated; if exp returns a ! 187: value $v$, then $v$ is returned. If exp raises an exception $e$ then ! 188: the match is applied to $e$. If the match fails, then $e$ is raised ! 189: (as the value of the \verb"handle" expression). If the match ! 190: succeeds, then the resulting value is returned. ! 191: ! 192: \item[\verb"let" dec \verb"in" exp \verb"end"\hfill] dec is evaluated, ! 193: returning $E'$; then exp is evaluated in the environment $E+E'$. ! 194: ! 195: \item[\verb"fn" match\hfill] $f$ is returned, where $f$ is the function of ! 196: $v$ gained by applying match to $v$ in the environment $E$, and such ! 197: that if the match fails, an exception \verb"Match" will be raised. ! 198: \label{raisematch} ! 199: But matches that may fail are to be detected by the ! 200: compiler and flagged with a warning; see Section~\ref{matchwarn}. ! 201: \end{description} ! 202: ! 203: \section{Evaluation of value bindings} ! 204: Evaluating a value binding in environment $E$ returns a value ! 205: environment $E'$ or raises an exception as follows: ! 206: \begin{description} ! 207: \item[pat \verb"=" exp\hfill] exp is evaluated in $E$, returning value ! 208: $v$; then pat is matched to $v$; if this returns $E'$ then $E'$ is ! 209: returned. If the pattern fails to match then the exception ! 210: \verb"Bind" will be raised. ! 211: \label{raisebind} ! 212: But bindings that may fail are to be detected by the ! 213: compiler and flagged with a warning; see Section~\ref{bindwarn}. ! 214: ! 215: \item[${\bf vb}_1$ \verb"and" \underline{\ \ \ } \verb"and" ${\bf vb}_n$\hfill] ! 216: The value bindings ${\bf vb}_1$ through ${\bf vb}_n$ are evaluated in ! 217: $E$ from left to right, returning $E_1 , ... E_n$; then $E_1 + ... + ! 218: E_n$ is returned. ! 219: ! 220: \item[\verb"rec" vb\hfill] {\bf vb} is evaluated in $E'$, returning $E''$, ! 221: where $E' = E + E''$. Because the values bound by \verb"rec" {\bf ! 222: vb} must be function values, $E'$ is well defined by ``tying knots'' ! 223: (Landin). ! 224: \end{description} ! 225: No binding may bind the same identifier twice. ! 226: ! 227: \label{bindwarn} ! 228: For each value binding ``pat = exp'' the compiler will issue a ! 229: warning message if {\it either} pat is not exhaustive {\it or} pat ! 230: contains no variable. This will (on both counts) detect a mistaken ! 231: declaration like \verb"val nil = f(x)" in which the user expects to ! 232: declare a new variable nil (whereas the language dictates that ! 233: \verb"nil" here is a constant pattern, so no variable gets declared). ! 234: However, these warnings need not be given at top level in the ! 235: interactive system. ! 236: \section{Evaluation of type and datatype bindings} ! 237: The value environment $E$ does not affect the evaluation of type ! 238: bindings or datatype bindings ($TE$ affects their type-checking and ! 239: compilation). Evaluation of a type binding just returns the empty ! 240: value environment $\{\}$; the purpose of type bindings is merely to ! 241: provide an abbreviation for a compound type. ! 242: ! 243: Evaluation of a ! 244: datatype binding {\bf db} returns a value environment $E'$ (it cannot ! 245: raise an exception) as follows: ! 246: ! 247: \begin{description} ! 248: \item[tyvars id = ${\bf constr}_1 \mid \underline{\ \ \ } \mid {\bf constr}_n$\hfill] ! 249: New constructors ${\bf con}_1, ... , {\bf con}_n$ are created. ! 250: The value environment $E' = \{ id_1 \mapsto v_1 , ... , id_n \mapsto ! 251: v_n \} $ is returned, where $v_i$ is either the constant value ! 252: ${\bf con}_i$ (if ${\bf constr}_i$ is just ${\bf id}_i$), or else the ! 253: function which maps $x$ to ${\bf con}_i(x)$ (if ${\bf constr}_i$ is ! 254: ${\bf id}_i$ \verb"of" {\bf ty}). ! 255: ! 256: \item[${\bf db}_1$ \verb"and" \underline{\ \ \ } \verb"and" ${\bf db}_n$\hfill] ! 257: The bindings ${\bf db}_1 , ... , {\bf db}_n$ ! 258: are evaluated from left to right, returning $E_1 , ... , E_n$; then ! 259: $E_1 + ... + E_n$ is returned. ! 260: \end{description} ! 261: In the left hand side ``tyvars id'' of a type of datatype binding, ! 262: no type-variable may appear twice in ``tyvars.'' ! 263: The right hand side may contain only the type variables ! 264: mentioned on the left. Within the scope of the declaration of ! 265: ``id,'' any occurrence of the type constructor ``id'' must be ! 266: accompanied by as many type arguments as indicated by the (possibly empty) ! 267: tyvar sequence ``tyvars'' in the declaration. ! 268: ! 269: No binding may bind the same identifier twice. ! 270: \section{Evaluation of exception bindings} ! 271: The evaluation of an exception binding in an environment $E$ returns an ! 272: environment $E'$ as follows: ! 273: \begin{description} ! 274: \item[id\hfill] A new exception constructor {\bf con} is generated, and ! 275: the environment $\{{\bf id} \mapsto {\bf con} \}$ is returned. ! 276: ! 277: \item[id \verb"of" ty \hfill] A new exception constructor {\bf con} is generated, ! 278: and the environment $\{{\bf id} \mapsto v\}$ is returned, where $v$ is the ! 279: function of $x$ that returns ${\bf con}(x)$. ! 280: ! 281: \item[${\bf id}_1$ \verb"=" ${\bf id}_2$ \hfill] The environment ! 282: $\{ {\bf id}_1 \mapsto E({\bf id}_2) \}$ is returned; that is, ! 283: ${\bf id}_1$ is bound to the same exception constructor as ${\bf id}_2$. ! 284: ! 285: \item[${\bf eb}_1$ \verb"and" \underline{\ \ \ } \verb"and" ${\bf eb}_n$\hfill] ! 286: The bindings ${\bf eb}_1 , ... , {\bf eb}_n$ ! 287: are evaluated from left to right, returning $E_1 , ... , E_n$; then ! 288: $E_1 + ... + E_n$ is returned. ! 289: \end{description} ! 290: No binding may bind the same identifier twice. ! 291: \section{Evaluation of declarations} ! 292: ! 293: Evaluating a declaration in a value environment $E$ returns a value ! 294: environment $E'$ or raises an exception as follows (as usual in this chapter, ! 295: the effect on type environments is ignored): ! 296: ! 297: \begin{description} ! 298: \item[\verb"val" vb\hfill] The value binding {\rm vb} is evaluated, ! 299: returning $E'$; then $E'$ is returned. ! 300: ! 301: \item[\verb"type" tb\hfill] The empty environment $\{\}$ is returned. ! 302: ! 303: \item[\verb"datatype" db\hfill] {\rm db} is evaluated, returning ! 304: $E'$, which is returned. ! 305: ! 306: \item[\verb"exception" eb\hfill] {\rm eb} is evaluated, returning ! 307: $E'$, which is returned. ! 308: ! 309: \item[\verb"local" ${\bf dec}_1$ \verb"in" ${\bf dec}_2$ \verb"end"\hfill] ! 310: ${\rm dec}_1$ is evaluated in $E$, returning $E_1$; then ! 311: ${\rm dec}_2$ is evaluated in $E+E_1$, returning $E_2$; then $E+E_2$ ! 312: is returned. ! 313: ! 314: \item[${\bf dec}_1$ ${\bf dec}_2$\hfill] ! 315: ${\rm dec}_1$ is evaluated in $E$, returning $E_1$; then ! 316: ${\rm dec}_2$ is evaluated in $E+E_1$, returning $E_2$; then $E_1+E_2$ ! 317: is returned. ! 318: ! 319: \item[${\bf dec}$ \verb";"\hfill] has the same effect as {\bf dec}. ! 320: \end{description} ! 321: \section{Evaluation of a program} ! 322: The evaluation of a program ${\bf dec}_1$ \verb";" \underline{\ \ \ } ! 323: \verb";" ${\bf dec}_n$ takes place in the initial presence of the ! 324: standard top-level environment $E_0$ containing all the standard ! 325: bindings (see Appendix~\ref{library}). For $i>0$ the top-level environment ! 326: $E_i$, present after the evaluation of ${\bf dec}_i$ in the program, ! 327: is defined recursively as follows: ${\bf dec}_i$ is evaluated in ! 328: $E_{i-1}$ returning environment ${E'}_i$, and then $E_i = ! 329: E_{i-1}+{E'}_i$.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.