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

1.1       root        1: \chapter{Derived forms}
                      2: \label{derived}
                      3: ML is equipped with a number of {\em derived forms}, which in no way
                      4: add to the power of the language, as each is expressible in terms of
                      5: the more primitive constructs.
                      6: 
                      7: The $n$-tuple type 
                      8: \verb"("$ty_1$\verb"*"$ty_2$\verb"*"~$\cdots$~\verb"*"$ty_n$\verb")"
                      9: for $n\geq 2$ is an abbreviation for the record type with numeric labels
                     10: \verb"{1:"$ty_1$\verb",2:"$ty_2$\verb","~$\cdots$~\verb","$n$\verb":"$ty_n$\verb"}".
                     11: Similarly the $n$-tuple expression 
                     12: \verb"("$exp_1$\verb","$exp_2$\verb","~$\cdots$~\verb","$exp_n$\verb")"
                     13: is an abbreviation for the record expression 
                     14: verb"{1="$exp_1$\verb",2="$exp_2$\verb","~$\cdots$~\verb","$n$\verb"="$exp_n$\verb"}",
                     15: and the $n$-tuple pattern
                     16: \verb"("$pat_1$\verb","$pat_2$\verb","~$\cdots$~\verb","$pat_n$\verb")"
                     17: is an abbrevation for the record pattern 
                     18: verb"{1="$pat_1$\verb",2="$pat_2$\verb","~$\cdots$~\verb","$n$\verb"="$pat_n$\verb"}".
                     19: 
                     20: The ``empty record'' \verb"{}" can also be written as \verb"()".  This
                     21: value is conventionally returned from functions that have side-effects
                     22: but don't return an interesting value.  The type of empty records
                     23: is named \verb"unit" (because the type only contains one value).
                     24: 
                     25: The expression \verb"#"{\it lab}  for any label (symbolic or numeric)
                     26: is a selector function that extracts the named field from a record.
                     27: 
                     28: The \verb"case"~{\it exp}~\verb"of"~{\it match} expression is completely
                     29: equivalent to a \verb"(fn"~{\it match}\verb")" expression applied to
                     30: the {\it exp}.
                     31: 
                     32: The \verb"if"-\verb"then"-\verb"else" expression has conventional semantics:
                     33: it evaluates a boolean condition, then evaluates either the \verb"then"
                     34: expression or the \verb"else" expression; this behavior can be defined
                     35: in terms of a \verb"case" with patterns \verb"true" and \verb"false".
                     36: 
                     37: The \verb"orelse" and \verb"andalso" boolean operators evaluate their
                     38: right-hand expressions only if the left-hand expressions are insufficient
                     39: to determine the answer (i.e. \verb"false" for \verb"orelse" and \verb"true"
                     40: for \verb"andalso").  Their syntactic precedence is weaker than all other
                     41: infix operators, and \verb"orelse" binds weaker than \verb"andalso".
                     42: 
                     43: Several expressions may be separated by semicolons, and the whole enclosed
                     44: in parentheses;  all the expressions will be evaluated and the result
                     45: of the whole will is the result of the last expression.  When such an
                     46: {\it expression sequence} is the entire body of a \verb"let" expression,
                     47: the parentheses may be omitted.
                     48: 
                     49: The expression \verb"while"~$exp_1$~\verb"do"~$exp_2$ repeatedly evaluates
                     50: $exp_1$ followed by $exp_2$ until $exp_1$ evaluates to \verb"false" 
                     51: (just as in Pascal); the \verb"while" expression can be expressed 
                     52: in terms of a recursive function.
                     53: 
                     54: The expression 
                     55: \verb"["$exp_1$\verb","$exp_2$\verb","$\cdots$\verb","$exp_n$\verb"]" is
                     56: an abbreviation for the list 
                     57: $exp_1$\verb"::"$exp_2$\verb"::"$\cdots$\verb"::"$exp_n$\verb"::nil",
                     58: and similarly the pattern
                     59: \verb"["$pat_1$\verb","$pat_2$\verb","$\cdots$\verb","$pat_n$\verb"]" is
                     60: an abbreviation for the list pattern
                     61: $pat_1$\verb"::"$pat_2$\verb"::"$\cdots$\verb"::"$pat_n$\verb"::nil".
                     62: In both patterns and expressions, \verb"[]" is an abbrevation for \verb"nil".
                     63: 
                     64: In a record pattern (but not in a record expression), an element
                     65: $id$\verb"="$id$, where the pattern is a variable with the same identifier
                     66: as the label, can be abbreviated as just $id$.  Similarly, 
                     67: $id$\verb"=~"$id$~verb"as"~{\it pat} can be abbreviated
                     68: as "$id$~verb"as"~{\it pat},
                     69: $id$\verb"=~"$id$~verb":"~{\it ty} can be abbreviated
                     70: "$id$~verb":"~{\it ty}.
                     71: 
                     72: Recursive clausal function definitions can be defined conviently with
                     73: the \verb"fun" keyword.  The declaration
                     74: \begin{verbatim}
                     75: fun f pat1a pat2a pat3a = exp1
                     76:   | f pat1b pat2b pat3b = exp2
                     77:   | f pat1c pat2c pat3c = exp2
                     78: \end{verbatim}
                     79: is an abbreviation for the curried function
                     80: \begin{verbatim}
                     81: val rec f = fn pat1 => fn pat2 => fn pat3 =>
                     82:              case (pat1,pat2,pat3)
                     83:               of (pat1a,pat2a,pat3a) => exp1
                     84:                | (pat1b,pat2b,pat3b) => exp1
                     85:                | (pat1c,pat2c,pat3c) => exp1
                     86: \end{verbatim}
                     87: The patterns must all be atomic patterns (including, of course, 
                     88: arbitrary patterns enclosed in parentheses) to avoid syntactic ambiguity.
                     89: 
                     90: A special form of \verb"fun" declaration is permitted for infixed
                     91: function identifiers, of which an example is shown here:
                     92: \begin{verbatim}
                     93: fun a + b = b - ~a
                     94: \end{verbatim}
                     95: 
                     96: The derived forms are summarized in the tables below.
                     97: 
                     98: \section{Expressions and patterns}
                     99: \begin{tabular}{@{}l l}
                    100: {\bf Derived Form}&{\bf Equivalent Form} \\ \hline
                    101: \multicolumn{2}{l}{\bf Types:} \\
                    102: ${\rm ty}_1$ \verb"*" \rep{2} \verb"*" ${\rm ty}_n$ &
                    103: \verb"{" 1 : ${\rm ty}_1$ , \rep{2} , $n$ : ${\rm ty}_n$ \verb"}"  \\ \hline
                    104: \multicolumn{2}{l}{\bf Expressions:} \\ 
                    105: \verb"()" & \verb"{ }"\\ \xskip
                    106: \verb"(" ${\rm exp}_1$ \verb"," \rep{2} \verb"," ${\rm exp}_n$ \verb")" &
                    107: \verb"{" 1 \verb"=" ${\rm exp}_1$ , \rep{2} ,
                    108: $n$ \verb"=" ${\rm exp}_n$  \verb"}" \\ \xskip
                    109: \verb"case" exp \verb"of" match & ( \verb"fn" match ) ( exp ) \\ \xskip
                    110: \verb"#" lab & \verb"fn {" lab \verb"= x , ...} => x" \\ \xskip
                    111: \verb"if" exp \verb"then" ${\rm exp}_1$ \verb"else" ${\rm exp}_2$ &
                    112: \verb"case" exp \verb"of true =>" ${\rm exp}_1$ \\
                    113: & \ \ \ \ \ \ \ \ \ \  \verb"| false =>" ${\rm exp}_2$ \\ \xskip
                    114: ${\rm exp}_1$ \verb"orelse" ${\rm exp}_2$ &
                    115: \verb"if" ${\rm exp}_1$ \verb"then true else" ${\rm exp}_2$ \\ \xskip
                    116: ${\rm exp}_1$ \verb"andalso" ${\rm exp}_2$ &
                    117: \verb"if" ${\rm exp}_1$ \verb"then" ${\rm exp}_2$ \verb"else false" \\ \xskip
                    118: ( ${\rm exp}_1$ ; \rep{1} ; ${\rm exp}_n$ ; exp) &
                    119: \verb"case"  ${\rm exp}_1$ \verb"of _ =>" \underline{\ \ \ } \verb"=>" \\
                    120: & \ \ \  \verb"case"  ${\rm exp}_n$ \verb"of _ =>" exp \\ \xskip
                    121: \verb"let" dec \verb"in" ${\rm exp}_1$ ; \rep{1} ; ${\rm exp}_n$ \verb"end"
                    122: &
                    123: \verb"let" dec \verb"in" ( ${\rm exp}_1$ ; \rep{1} ; ${\rm exp}_n$) \verb"end"
                    124: \\ \xskip
                    125: \verb"while" ${\rm exp}_1$ \verb"do" ${\rm exp}_2$ &
                    126: \parbox[t]{2.5in}{\begin{raggedright}
                    127: \verb"let val rec f = fn () =>" \\
                    128: \ \ \verb"if"  ${\rm exp}_1$ \verb"then (" ${\rm exp}_2$ \verb"; f()) else ()"
                    129: \\
                    130: \verb" in f() end"
                    131: \end{raggedright}} \\ \xskip
                    132: \verb"[" ${\rm exp}_1$ , \rep{0} , ${\rm exp}_n$ \verb"]" &
                    133: ${\rm exp}_1$ \verb"::" \rep{0} \verb"::" ${\rm exp}_n$ \verb":: nil" \\
                    134: \hline
                    135: \pagebreak[1]
                    136: {\bf Derived Form}&{\bf Equivalent Form} \\ \hline
                    137: \multicolumn{2}{l}{\bf Patterns:} \\ 
                    138: \verb"()" & \verb"{ }"   {\it (no space between ``\/\verb"()"'')} \\ \xskip
                    139: \verb"(" ${\rm pat}_1$ \verb"," \rep{2} \verb"," ${\rm pat}_n$ \verb")" &
                    140: \verb"{" 1 \verb"=" ${\rm pat}_1$ , \rep{2} ,
                    141: $n$ \verb"=" ${\rm pat}_n$  \verb"}" \\ \xskip
                    142: 
                    143: \verb"[" ${\rm pat}_1$ , \rep{0} , ${\rm pat}_n$ \verb"]" &
                    144: ${\rm pat}_1$ \verb"::" \rep{0} \verb"::" ${\rm pat}_n$ \verb":: nil" \\ \xskip
                    145: \verb"{" \underline{\ \ \ } , id , \underline{\ \ \ } \verb"}" &
                    146: \verb"{" \underline{\ \ \ } , id \verb"=" id , \underline{\ \ \ } \verb"}" \\ \xskip
                    147: \verb"{" \underline{\ \ \ } , id \verb"as" pat, \underline{\ \ \ } \verb"}" &
                    148: \verb"{" \underline{\ \ \ } , id \verb"=" id \verb"as" pat, \underline{\ \ \ } \verb"}" \\ \xskip
                    149: \verb"{" \underline{\ \ \ } , id : ty , \underline{\ \ \ } \verb"}" &
                    150: \verb"{" \underline{\ \ \ } , id \verb"=" id : ty , \underline{\ \ \ } \verb"}" \\
                    151: \hline
                    152: \end{tabular}
                    153: 
                    154: Each derived form is identical semantically to its ``equivalent
                    155: form.''  The type-checking of each derived form is also defined by
                    156: that of its equivalent form.  The precedence among all primitive and
                    157: derived forms is shown in Appendix~\ref{grammar}.
                    158: 
                    159: The derived type ${\rm ty}_1$ \verb"*" \rep{2} \verb"*" ${\rm ty}_n$
                    160: is called an (n--)tuple type, and the values of this type are called
                    161: (n--)tuples.
                    162: 
                    163: The final derived pattern allows a label and its associated value to
                    164: be elided in a record pattern, when they are the same identifier.
                    165: 
                    166: \section{Bindings and declarations}
                    167: 
                    168: A syntax class {\bf fb} of function bindings is used as a convient
                    169: form of value binding for (possibly recursive) function declarations.
                    170: The equivalent form of each function binding is an ordinary value
                    171: binding.  These new function bindings must be declared by \verb"fun",
                    172: not by \verb"val"; however, functions may still be declared using
                    173: \verb"val" or \verb"val rec" along with \verb"fn" expressions.
                    174: 
                    175: \begin{tabular}{@{}l l}
                    176: \multicolumn{1}{c}{\bf Derived Form}&
                    177: \multicolumn{1}{c}{\bf Equivalent Form} \\ \hline
                    178: \multicolumn{2}{l}{\bf Function bindings {\rm fb}:} \\
                    179: & id = \verb"fn" $x_1$ \verb"=>" \rep{1} \verb"=> fn" $x_n$ \verb"=>" \\
                    180:  & \ \ \verb"case (" $x_1,$ \underline{\ \ \ } $, x_n$ \verb")" \\
                    181: \ id ${\rm apat}_{11}$ \rep{1} ${\rm apat}_{1n}$ cst = ${\rm exp}_1$ &
                    182: \ \ \verb"of" ( ${\rm apat}_{11}$ , \rep{1} , ${\rm apat}_{1n}$  \verb"=>" ${\rm exp}_1$ cst \\
                    183: \verb"|" \underline{\ \ \ } & \ \ \verb"|" \underline{\ \ \ } \\
                    184: \verb"|" id ${\rm apat}_{m1}$ \rep{1} ${\rm apat}_{mn}$ cst = ${\rm exp}_m$ &
                    185: \ \ \ \verb"|" ( ${\rm apat}_{m1}$ , \rep{1} , ${\rm apat}_{mn}$  \verb"=>" ${\rm exp}_m$ cst \\
                    186: 
                    187:  & \\
                    188: ${\rm fb}_1$ and \rep{1} and ${\rm fb}_n$ &
                    189: ${\rm vb}_1$ and \rep{1} and ${\rm vb}_n$ \\
                    190: &{\it (where ${\rm vb}_i$ is the equivalent of\/ ${\rm fb}_i$) } \\
                    191: \hline
                    192: \multicolumn{2}{l}{\bf Declarations:} \\
                    193: \verb"fun" fb & \verb"val rec" vb \\
                    194: &{\it (where \/{\rm vb} is the equivalent of\/ {\rm fb}) } \\
                    195: & \\
                    196: exp & \verb"val it =" exp    {\it (only at top level)}\\
                    197: \hline
                    198: \end{tabular}
                    199: In the table above, ``cst'' stands for an optional type constraint---a colon
                    200: followed by a type expression.
                    201: The last derived declaration (using ``it'') is only allowed at
                    202: top-level, for treating top-level expressions as degenerate
                    203: declarations; ``it'' is just a normal value variable.

unix.superglobalmegacorp.com

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