summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/urweb.h2
-rw-r--r--lib/basis.urs5
-rw-r--r--src/c/urweb.c11
-rw-r--r--src/elaborate.sml8
-rw-r--r--tests/option.ur6
-rw-r--r--tests/option.urp5
-rw-r--r--tests/toString.ur3
-rw-r--r--tests/toString.urp5
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