diff options
-rw-r--r-- | include/urweb.h | 2 | ||||
-rw-r--r-- | lib/basis.urs | 5 | ||||
-rw-r--r-- | src/c/urweb.c | 11 | ||||
-rw-r--r-- | src/elaborate.sml | 8 | ||||
-rw-r--r-- | tests/option.ur | 6 | ||||
-rw-r--r-- | tests/option.urp | 5 | ||||
-rw-r--r-- | tests/toString.ur | 3 | ||||
-rw-r--r-- | tests/toString.urp | 5 |
8 files changed, 40 insertions, 5 deletions
diff --git a/include/urweb.h b/include/urweb.h index 8b74a21b..f4f33362 100644 --- a/include/urweb.h +++ b/include/urweb.h @@ -67,3 +67,5 @@ lw_Basis_string lw_Basis_sqlifyString(lw_context, lw_Basis_string); lw_Basis_bool lw_Basis_sqlifyBool(lw_context, lw_Basis_bool); char *lw_Basis_ensqlBool(lw_Basis_bool); + +lw_Basis_string lw_Basis_intToString(lw_context, lw_Basis_int); diff --git a/lib/basis.urs b/lib/basis.urs index b9f773c2..109ab31a 100644 --- a/lib/basis.urs +++ b/lib/basis.urs @@ -6,6 +6,8 @@ type unit = {} datatype bool = False | True +(*datatype option t = None | Some of t*) + (** Basic type classes *) @@ -21,6 +23,9 @@ val eq_bool : eq bool val strcat : string -> string -> string +val intToString : int -> string + + (** SQL *) diff --git a/src/c/urweb.c b/src/c/urweb.c index c5f3a716..78a8e0f8 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -670,3 +670,14 @@ char *lw_Basis_ensqlBool(lw_Basis_bool b) { else return (char *)&true; } + +lw_Basis_string lw_Basis_intToString(lw_context ctx, lw_Basis_int n) { + int len; + char *r; + + lw_check_heap(ctx, INTS_MAX); + r = ctx->heap_front; + sprintf(r, "%lld%n", n, &len); + ctx->heap_front += len+1; + return r; +} diff --git a/src/elaborate.sml b/src/elaborate.sml index 5770fe5b..bf6137b5 100644 --- a/src/elaborate.sml +++ b/src/elaborate.sml @@ -1923,6 +1923,10 @@ fun elabSgn_item ((sgi, loc), (env, denv, gs)) = val nxs = length xs - 1 val t = ListUtil.foldli (fn (i, _, t) => (L'.CApp (t, (L'.CRel (nxs - i), loc)), loc)) t xs + val (env', denv') = foldl (fn (x, (env', denv')) => + (E.pushCRel env' x k, + D.enter denv')) (env, denv) xs + val (xcs, (used, env, gs)) = ListUtil.foldlMap (fn ((x, to), (used, env, gs)) => @@ -1931,9 +1935,9 @@ fun elabSgn_item ((sgi, loc), (env, denv, gs)) = NONE => (NONE, t, gs) | SOME t' => let - val (t', tk, gs') = elabCon (env, denv) t' + val (t', tk, gs') = elabCon (env', denv') t' in - checkKind env t' tk k; + checkKind env' t' tk k; (SOME t', (L'.TFun (t', t), loc), gs' @ gs) end val t = foldl (fn (x, t) => (L'.TCFun (L'.Implicit, x, k, t), loc)) t xs diff --git a/tests/option.ur b/tests/option.ur index 76fcc6ea..d9e901bf 100644 --- a/tests/option.ur +++ b/tests/option.ur @@ -9,15 +9,15 @@ val show = fn x => case x of None => "None" | Some x => x val show2 = fn x => case x of None => "None'" | Some x => show x -val page = fn x => <html><body> +val page = fn x => return <html><body> {cdata (show x)} </body></html> -val page2 = fn x => <html><body> +val page2 = fn x => return <html><body> {cdata (show2 x)} </body></html> -val main : unit -> page = fn () => <html><body> +val main : unit -> transaction page = fn () => return <html><body> <li><a link={page none_Hi}>None1</a></li> <li><a link={page some_Hi}>Some1</a></li> <li><a link={page2 none_some_Hi}>None2</a></li> diff --git a/tests/option.urp b/tests/option.urp new file mode 100644 index 00000000..865e089f --- /dev/null +++ b/tests/option.urp @@ -0,0 +1,5 @@ +debug +database dbname=test +exe /tmp/webapp + +option diff --git a/tests/toString.ur b/tests/toString.ur new file mode 100644 index 00000000..830f4713 --- /dev/null +++ b/tests/toString.ur @@ -0,0 +1,3 @@ +fun main () : transaction page = return <html><body> + 6 = {cdata (intToString 6)} +</body></html> diff --git a/tests/toString.urp b/tests/toString.urp new file mode 100644 index 00000000..e29d34cd --- /dev/null +++ b/tests/toString.urp @@ -0,0 +1,5 @@ +debug +database dbname=test +exe /tmp/webapp + +toString |