Initial revision
[bpt/mlt.git] / doc / manual.tex
1 \documentclass{article}
2 \usepackage{fullpage}
3
4 \title{mlt manual}
5 \author{Adam Chlipala}
6
7 \begin{document}
8
9 \maketitle
10
11 \section{Introduction}
12
13 This system is currently in need of a good name. I will use either ``mlt'' or generic terms to refer to it for now.
14
15 mlt is a system for the creation of dynamic web sites based around Standard ML. The meat of the system deals with compiling a template language. This language is purposely simplistic. It's not possible to create a non-terminating template without the complicity of SML code that it calls. Templates look like HTML source files with SML-like code inserted in strategic places. They are capable of full interaction with all types and values in any SML structures. The current implementation interfaces with web servers via the standard CGI protocol.
16
17 \section{Tool usage}
18
19 \begin{enumerate}
20 \item Choose a directory to hold the sources for the dynamic web site project.
21 \item Edit a {\tt mlt.conf} file in that directory to set project options, including which SML/NJ CM libraries to use, where to put some generated SML sources and binary files, and where to publish the actual CGI scripts.
22 \item Create a set of Standard ML support files.
23 \item Create a set of templates with {\tt .mlt} filename extensions. Each {\tt {\it page}.mlt} will become a CGI script named {\tt {\it page}}, and they may interact with libraries and project SML sources.
24 \item Run the {\tt mlt} command-line program with no arguments.
25 \item If it reports any errors, correct them and repeat the last step.
26 \item Access your site from the base URL corresponding to the directory you chose for script output. (Probably a ``cgi-bin'' directory of some sort)
27 \end{enumerate}
28
29 \section{{\tt mlt.conf} files}
30
31 Settings concerning compilation and publishing of projects are controlled by {\tt mlt.conf} files. There will generally be two files that influence a particular project: a system-wide file (probably in {\tt /etc/mlt.conf}) and the {\tt mlt.conf} file in the project directory. Single-value option settings from the project configuration override the system-wide configuration when there is a conflict.
32
33 Files consist of a sequence of the following kinds of lines in any order:
34
35 \begin{itemize}
36 \item {\tt in {\it directory}}: Treat {\it directory} as the project directory. This defaults to the current working directory.
37
38 \item {\tt out {\it directory}}: Use {\it directory} as the working directory. Among other things, a {\tt heap.x86-linux} file will be placed here that must be readable by the web server that you intend to use. (If the server runs your CGI scripts as your user, like Apache does with suexec, then you probably don't need to worry about this.) This defaults to the current working directory.
39
40 \item {\tt pub {\it directory}}: Publish CGI scripts to {\it directory}. Each will be a {\tt sh} shell script that runs SML/NJ with the generated {\tt heap.x86-linux} and appropriate arguments. This defaults to the current working directory.
41
42 \item {\tt lib {\it file}}: {\it file} is the path to the {\tt .cm} file for the mlt template library. This is the library built from the {\tt src/lib/} tree. It defaults to {\tt /usr/local/share/mlt/src/lib/sources.cm}.
43
44 \item {\tt compiler {\it file}}: {\it file} is the path to the {\tt .cm} file for the mlt compiler library. This is the library built from the {\tt src/} tree. It defaults to {\tt /usr/local/share/mlt/src/sources.cm}.
45
46 \item {\tt sml {\it directory}}: {\it directory} is the path to the SML/NJ {\tt bin} directory. It defaults to {\tt /usr/local/sml/bin}.
47
48 \item {\tt cm {\it file}}: {\it file} is the path to a file that the SML/NJ Compilation Manager understands (i.e., {\tt .cm}, {\tt .sml}, {\tt .sig}, {\tt .grm}, {\tt .lex}). This file is to be made available to templates in the project.
49
50 \item {\tt print {\it type} = {\it code}}: This declares that the given {\it code} is an SML expression that evaluates to an appropriate function for printing values of the SML {\it type}. The {\it code} should usually be the name of a function defined in a library or project SML source file.
51 \end{itemize}
52
53 \section{The template language}
54
55 The template language at the moment is a somewhat ad-hoc mixture of SML-style and Java-style syntax. The exact typing rules for the constructs described below should be clear to anyone with a good knowledge of SML.
56
57 \subsection{Grammar}
58
59 Template files (denoted by the filename extension {\tt .mlt}) are HTML source files with embedded declarations and statements in an SML-like language. Statements and declarations are separated by semicolons where necessary to disambiguate. The exact grammar can be found in ml-yacc form in {\tt src/mlt.grm}.
60
61 \subsection{Expressions}
62
63 \subsubsection{Constants}
64
65 Base type constants such as 1, $\sim 2$, and {\tt "some string"} are available, with identical types and meanings as in Standard ML. Character constants are denoted like 'x'.
66
67 \subsubsection{Variables}
68
69 User-defined variables are denoted the same way as in SML, except that the apostrophe character is disallowed in their identifiers.
70
71 \subsubsection{Paths}
72
73 While templates cannot define their own structures, they may access structures from imported libraries and project SML sources. The syntax for this is identical to the SML syntax, i.e., {\tt Posix.FileSys.opendir} or {\tt valOf}. The second example is treated as a path projecting the {\tt valOf} function from the top-level environment.
74
75 \subsubsection{Binary operators}
76
77 There is no mechanism for user definition of infix operators, but the following binary operators are supported: $+$, $-$, $*$, $/$, $\%$, $=$, $<>$, $<$, $<=$, $>$, $>=$, $::$, \^{}, {\tt and}, and {\tt or}. They are identical to SML operators, save that SML {\tt div} becomes $/$, {\tt mod} becomes $\%$, {\tt andalso} becomes {\tt and}, and {\tt orelse} becomes {\tt or}.
78
79 \subsubsection{Unary operators}
80
81 In addition to SML's $\sim$ prefix negation operator, there is a \$ operator for CGI parameter extraction. \$ has type {\tt string -> string}, so you can use it like {\tt \$"name"} to retrieve the value of the form field {\tt name}. \$ returns {\tt ""} for unset parameters.
82
83 \subsubsection{Applications}
84
85 Function application is like SML application.
86
87 \subsection{Tuples}
88
89 Tuple and {\tt ()} expressions are handled identically to how they are in SML.
90
91 \subsubsection{Records}
92
93 The syntax for creating records and extracting their fields is identical to SML's, with a few added conveniences. Record fields given in a record constructor without values are assigned the values of variables of the same names. For example, if there is a variable {\tt x} in scope, then the expressions {\tt \{x = x\}} and {\tt \{x\}} are equivalent. There are also O'Caml style functional record update expressions, such as {\tt \{myRecord with a = 1, b = 2\}} to construct a record identical to {\tt myRecord} except for the given field replacements.
94
95 \subsubsection{Template calls}
96
97 Where {\tt temp} is the name of a template in the current project, {\tt @temp} evaluates to a function {\tt (string * string) list -> unit} that takes in a list of name-value pairs for CGI parameters to modify and runs {\tt temp} with those changes. The Compilation Manager will prevent template calls from being used to implement any sort of recursion.
98
99 \subsection{Patterns}
100
101 Patterns are identical to SML patterns without support for user-defined infix constructors, though {\tt ::} is supported. Record patterns can include field names with no assigned patterns (the pattern for such a field is taken to be the field name) and "flex record" {\tt ...}'s to stand for unused fields.
102
103 \subsection{Statements and declarations}
104
105 \subsubsection{\tt Expressions}
106
107 An expression appearing in a statement position is evaluated and printed into the web page output. The function used to print it is found among the {\tt print} directives in {\tt mlt.conf} files.
108
109 \subsubsection{\tt open}
110
111 This construct is identical to SML's and is used as a convenience to import all bindings from a list of structures into the environment for the enclosing block.
112
113 \subsubsection{\tt val}
114
115 {\tt val} bindings are identical to those in SML.
116
117 \subsubsection{References}
118
119 Variables with reference type are introduced with {\tt ref} declarations, which give lists of identifiers and their initial values. An example is {\tt ref x = 1, y = 2}. Where such a definition is in scope, the defined reference variables are used like normal variables with no need to explicitly dereference them. The value of a reference variable is updated with the usual {\tt :=} operator, with the difference that such update assignments are separate kinds of statements, not expressions with {\tt unit} type.
120
121 \subsubsection{{\tt if}..{\tt then}..{\tt else}}
122
123 If statements are in the usual imperative style, meaning that else clauses are optional. They are of the form:
124
125 \begin{verbatim}
126 if (condition1)
127 {
128 block1
129 }
130 else if (condition 2)
131 {
132 block 2
133 }
134 else
135 {
136 block 3
137 }
138 \end{verbatim}
139
140 The {\tt block}s are sequences of statements and declarations. Every {\tt if} statement is followed by zero or more {\tt else if}'s and one or zero {\tt else}'s. Conditions must be enclosed in parentheses.
141
142 \subsubsection{\tt foreach}
143
144 All looping is done via {\tt foreach} statements, which have two forms. One is:
145
146 \begin{verbatim}
147 foreach (var in exp)
148 {
149 block
150 }
151 \end{verbatim}
152
153 Where {\tt exp} has type {\tt t list}, {\tt block} is executed for each of {\tt exp}'s elements, binding {\tt var} to each of them in order from first to last.
154
155 There is also a shortcut integer iteration form:
156
157 \begin{verbatim}
158 foreach (var in fromExp .. toExp)
159 {
160 block
161 }
162 \end{verbatim}
163
164 {\tt fromExp} and {\tt toExp} must have type {\tt int}. {\tt block} is evaluated with {\tt var} bound in sequence to each integer in the range defined by {\tt fromExp} and {\tt toExp}.
165
166 \subsubsection{\tt case}
167
168 {\tt case} statements are straightforward imperative modifications of SML {\tt case} expressions, such as:
169
170 \begin{verbatim}
171 case (exp)
172 (pat1) { block1 }
173 (pat2) { block2 }
174 \end{verbatim}
175
176 The case object and patterns must be enclosed in parentheses.
177
178 \subsubsection{{\tt try}..{\tt catch}}
179
180 This construction is to SML's {\tt handle} what template {\tt case} is to SML {\tt case}. For example:
181
182 \begin{verbatim}
183 try
184 {
185 block1
186 }
187 catch (pat1)
188 {
189 block2
190 }
191 catch (pat2)
192 {
193 block3
194 }
195 \end{verbatim}
196
197 \end{document}