adamc@404
|
1 <p><b>Ur/Web</b> is a domain-specific language for programming web applications backed by SQL databases. It is (strongly) statically-typed (like ML and Haskell) and purely functional (like Haskell). <b>Ur</b> is the base language, and the web-specific features of Ur/Web (mostly) come only in the form of special rules for parsing, type inference, and optimization. The Ur core looks a lot like <a href="http://sml.sourceforge.net/">Standard ML</a>, with a few <a href="http://www.haskell.org/">Haskell</a>-isms added, and kinder, gentler versions added of many features from dependently-typed languages like the logic behind <a href="http://coq.inria.fr/">Coq</a>. The type system is much more expressive than in ML and Haskell, such that well-typed web applications cannot "go wrong," not just in handling single HTTP requests, but across their entire lifetimes of interacting with HTTP clients. Beyond that, Ur is unusual is using ideas from dependent typing to enable very effective metaprogramming, or programming with explicit analysis of type structure. Many common web application components can be built by Ur/Web functions that operate on types, where it seems impossible to achieve similar code re-use in more established languages.</p>
|
adamc@404
|
2
|
adamc@404
|
3 <p>This demo is built automatically from Ur/Web sources and supporting files. If you unpack the Ur/Web source distribution, then the following steps will build you a local version of this demo:
|
adamc@404
|
4
|
adamc@404
|
5 <blockquote><pre>./configure
|
adamc@404
|
6 make
|
adamc@404
|
7 sudo make install
|
adamc@404
|
8 urweb -demo /Demo demo</pre></blockquote></p>
|
adamc@404
|
9
|
adamc@404
|
10 <p>The <tt>-demo /Demo</tt> flag says that we want to build a demo application that expects its URIs to begin with <tt>/Demo</tt>. The final argument <tt>demo</tt> gives the path to a directory housing demo files. One of the files in that directory is <tt>prose</tt>, a file describing the different demo pieces with HTML. Some lines of <tt>prose</tt> have the form <tt><i>foo</i>.urp</tt>, naming particular project files (with the extension <tt>.urp</tt>) in that directory.</p>
|
adamc@404
|
11
|
adamc@404
|
12 <p>These project files can also be built separately. For example, you could run
|
adamc@404
|
13
|
adamc@404
|
14 <blockquote><pre>urweb demo/hello</pre></blockquote>
|
adamc@404
|
15
|
adamc@404
|
16 to build the "Hello World" demo application. Whether building the pieces separately or all at once with the <tt>-demo</tt> flag, a standalone web server executable is generated. The <tt>-demo</tt> command line will generate <tt>demo/demo.exe</tt>, and the other command line will generate <tt>demo/hello.exe</tt>. Either can be run with a single argument, an integer specifying how many request handler pthreads to spawn. The server accepts requests on port 8080.</p>
|
adamc@404
|
17
|
adamc@404
|
18 <p>The <tt>-demo</tt> version also generates some HTML in a subdirectory <tt>out</tt> of the demo directory. It is easy to set Apache up to serve these HTML files, and to proxy out to the Ur/Web web server for dynamic page requests. This configuration works for me, where <tt>DIR</tt> is the location of an Ur/Web source distribution.
|
adamc@404
|
19
|
adamc@404
|
20 <blockquote><pre>Alias /demo/ "DIR/demo/out/"
|
adamc@404
|
21
|
adamc@404
|
22 ProxyPass /Demo/ http://localhost:8080/
|
adamc@404
|
23 ProxyPassReverse /Demo/ http://localhost:8080/</pre></blockquote></p>
|
adamc@404
|
24
|
adamc@404
|
25 <p>The rest of the demo focuses on the individual applications. Follow the links in the lefthand frame to visit the applications, commentary, and syntax-highlighted source code. (An Emacs mode is behind the syntax highlighting.) I recommend visiting the applications in the order listed, since that is the order in which new concepts are introduced.</p>
|
adamc@380
|
26
|
adamc@380
|
27 hello.urp
|
adamc@380
|
28
|
adamc@380
|
29 <p>This one is my favorite.</p>
|
adamc@380
|
30
|
adamc@380
|
31 link.urp
|
adamc@380
|
32
|
adamc@380
|
33 <p>This is my second favorite.</p>
|
adamc@403
|
34
|
adamc@403
|
35 listShop.urp
|
adamc@403
|
36
|
adamc@403
|
37 <p>This is my other favorite.</p>
|