|
|
1.1 ! root 1: \chapter{Reference values} ! 2: \label{reference} ! 3: References are cells whose contents may be changed after creation by ! 4: assignment. The \verb"ref" ``datatype'' constructor, and its ! 5: corresponding value constructor, are almost as if defined by the declaration ! 6: \begin{verbatim} ! 7: datatype 'a ref = ref of 'a ! 8: \end{verbatim} ! 9: Thus, a reference whose initial contents are the string \verb|"abc"| ! 10: may be created by \verb|val r = ref "abc"|. Subsequently, the ! 11: contents of \verb"r" may be altered by assignment: \verb|r := "def"|. ! 12: The contents of a reference may be examined by using the \verb"ref" ! 13: constructor in a pattern: ! 14: \begin{verbatim} ! 15: let val (ref s) = r ! 16: in print s ! 17: end ! 18: \end{verbatim} ! 19: The function \verb"!" is defined to take the contents of a reference; ! 20: that is, ! 21: \begin{verbatim} ! 22: fun ! (ref x) = x ! 23: \end{verbatim} ! 24: ! 25: References are not fully polymorphic; see Chapter~\ref{reftype}. ! 26: ! 27: Formally, we say that phrases in ML are evaluated in the presence of ! 28: an {\em environment} $E$ and a {\em store} $S$. The effect on $E$ of ! 29: evaluating declarations, expressions, etc. is described in ! 30: Chapter~\ref{eval}. Here we summarize the effect on $S$. ! 31: ! 32: The store $S$ maps reference values to their contents. Evaluation of ! 33: an expression in the store $S$ yields, depending on the form of the ! 34: expression, ! 35: \begin{description} ! 36: \item[\verb"ref" exp\hfill] exp is evaluated in $S$, ! 37: producing a value $v$ and a store $S'$; the ! 38: reference value $r$ is returned with the store $S'+\{r \mapsto v\}$. ! 39: ! 40: \item[${\rm exp}_1$~${\rm exp}_2$\hfill] ${\rm exp}_1$ is evaluated in $S$ ! 41: yielding the function $f_1$ and store $S'$; ! 42: ${\rm exp}_2$ is evaluated in $S'$ yielding $v_2$ and $S''$; ! 43: finally the body of $f_1$ is evaluated with its variable bound to $v_2$, ! 44: in the store $S''$, yielding the result $v$ and the store $S'''$. ! 45: ! 46: \item[\verb"op := "$({\rm exp}_1,{\rm exp}_2)$\hfill] The expression ! 47: $({\rm exp}_1,{\rm exp}_2)$ is evaluated in $S$, yielding the pair ! 48: $(r,v)$ and the store $S'$; then the unit value \{\} is returned with ! 49: the store $S'+\{r \mapsto v\}$. ! 50: ! 51: \item[\protect\verb"\{" ${\rm lab}_1$ \protect\verb"=" ${\rm exp}_1$ , \underline{\ \ \ } , ${\rm lab}_n$ \protect\verb"=" ${\rm exp}_n$ \protect\verb"\}" \hfill] ! 52: ${\rm exp}_1$ is evaluated in $S$, yielding $v_1$ and the store ! 53: $S_1$; then each ${\rm exp}_i$ is evaluated in $S_{i-1}$, yielding $v_i$ and the store $S_i$; then the record ! 54: $\{ {\rm lab}_1 = v_1 , ... , {\rm lab}_n = v_n \}$ is returned with ! 55: the store $S_n$. Note that the expressions are evaluated in the ! 56: sequence they are written, not in alphabetical order of the labels. ! 57: ! 58: \item[\protect\verb"raise" exp\hfill] exp is evaluated in $S$, returning $v$ ! 59: and $S'$; then the exception-packet $(v,S')$ is raised. ! 60: ! 61: \item[exp \verb"handle" match\hfill] exp is evaluated; if exp returns a ! 62: value $v$ with state $S'$, then $v$ is returned with $S'$. ! 63: If exp raises an exception-packet $(e,S'')$ then ! 64: the match is applied to $e$ in the state $S''$. ! 65: If the match fails, then $(e,S'')$ is raised ! 66: (as the value of the \verb"handle" expression). If the match ! 67: succeeds, then the resulting value is returned. ! 68: \end{description} ! 69: ! 70: Matching a pattern to a value has no effect on the store. Evaluating ! 71: a value binding has an effect on the store just from the evaluation of ! 72: the constituent expressions. Evaluation of type, datatype, or exception ! 73: bindings has no effect on the store. ! 74:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.