annotate tests/specialize.ur @ 1739:c414850f206f

Add support for -boot flag, which allows in-tree execution of Ur/Web The boot flag rewrites most hardcoded paths to point to the build directory, and also forces static compilation. This is convenient for developing Ur/Web, or if you cannot 'sudo make install' Ur/Web. The following changes were made: * Header files were moved to include/urweb instead of include; this lets FFI users point their C_INCLUDE_PATH at this directory at write <urweb/urweb.h>. For internal Ur/Web executables, we simply pass -I$PATH/include/urweb as normal. * Differentiate between LIB and SRCLIB; SRCLIB is Ur and JavaScript source files, while LIB is compiled products from libtool. For in-tree compilation these live in different places. * No longer reference Config for paths; instead use Settings; these settings can be changed dynamically by Compiler.enableBoot () (TODO: add a disableBoot function.) * config.h is now generated directly in include/urweb/config.h, for consistency's sake (especially since it gets installed along with the rest of the headers!) * All of the autotools build products got updated. * The linkStatic field in protocols now only contains the name of the build product, and not the absolute path. Future users have to be careful not to reference the Settings files to early, lest they get an old version (this was the source of two bugs during development of this patch.)
author Edward Z. Yang <ezyang@mit.edu>
date Wed, 02 May 2012 17:17:57 -0400
parents 60907c06b4c4
children
rev   line source
adamc@315 1 datatype list a = Nil | Cons of a * list a
adamc@315 2
adamc@315 3 fun isNil (t ::: Type) (ls : list t) : bool =
adamc@315 4 case ls of
adamc@315 5 Nil => True
adamc@315 6 | Cons _ => False
adamc@315 7
adamc@316 8 fun append (t ::: Type) (ls1 : list t) (ls2 : list t) : list t =
adamc@315 9 case ls1 of
adamc@315 10 Nil => ls2
adamc@315 11 | Cons (x, ls1') => Cons (x, append ls1' ls2)
adamc@315 12
adamc@317 13 fun pairAppend (t1 ::: Type) (t2 ::: Type) (ls1 : list (t1 * t2)) (ls2 : list (t1 * t2)) : list (t1 * t2) =
adamc@317 14 case ls1 of
adamc@317 15 Nil => ls2
adamc@317 16 | Cons (x, ls1') => Cons (x, pairAppend ls1' ls2)
adamc@317 17
adamc@315 18 fun delist (ls : list string) : xml body [] [] =
adamc@315 19 case ls of
adamc@315 20 Nil => <body>Nil</body>
adamc@316 21 | Cons (h, t) => <body>{cdata h} :: {delist t}</body>
adamc@315 22
adamc@317 23 fun pairDelist (ls : list (string * int)) : xml body [] [] =
adamc@317 24 case ls of
adamc@317 25 Nil => <body>Nil</body>
adamc@317 26 | Cons ((s, n), t) => <body>({cdata s}, {cdata (show _ n)}) :: {pairDelist t}</body>
adamc@317 27
adamc@315 28 val ls = Cons ("X", Cons ("Y", Cons ("Z", Nil)))
adamc@316 29 val ls' = Cons ("A", Cons ("B", Nil))
adamc@315 30
adamc@317 31 val pls = Cons (("X", 1), Cons (("Y", 2), Cons (("Z", 3), Nil)))
adamc@317 32 val pls' = Cons (("A", 1), Cons (("B", 2), Nil))
adamc@317 33
adamc@315 34 fun main () : transaction page = return <html><body>
adamc@315 35 {if isNil ls then <body>It's Nil.</body> else <body>It's not Nil.</body>}
adamc@316 36
adamc@316 37 <p>{delist (append ls' ls)}</p>
adamc@317 38
adamc@317 39 <p>{pairDelist (pairAppend pls' pls)}</p>
adamc@315 40 </body></html>