summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-03-10 12:44:40 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-03-10 12:44:40 -0400
commite2bfa72019653e309b7cdc3cf4ce4e6153712b1b (patch)
tree82f3cb492c30ab735fe779934eca0e58a1e6b461
parenta8f3cc9e254122906318531ef39b5cae89829ef4 (diff)
ListEdit demo, minus prose
-rw-r--r--demo/listEdit.ur54
-rw-r--r--demo/listEdit.urp2
-rw-r--r--demo/listEdit.urs1
-rw-r--r--lib/js/urweb.js6
-rw-r--r--src/elaborate.sml11
-rw-r--r--src/jscomp.sml26
-rw-r--r--src/monoize.sml8
7 files changed, 100 insertions, 8 deletions
diff --git a/demo/listEdit.ur b/demo/listEdit.ur
new file mode 100644
index 00000000..1a9851a7
--- /dev/null
+++ b/demo/listEdit.ur
@@ -0,0 +1,54 @@
+datatype rlist = Nil | Cons of {Data : source string,
+ NewData : source string,
+ Tail : source rlist}
+
+fun showString ss =
+ s <- signal ss;
+ return <xml>{[s]}</xml>
+
+fun show rls =
+ v <- signal rls;
+ show' v
+
+and show' rl =
+ case rl of
+ Nil => return <xml/>
+ | Cons {Data = ss, NewData = ss', Tail = rls} => return <xml>
+ <dyn signal={showString ss}/>
+ <button value="Change to:" onclick={s <- get ss'; set ss s}/>
+ <ctextbox source={ss'}/><br/>
+ <dyn signal={show rls}/>
+ </xml>
+
+fun main () =
+ head <- source Nil;
+ tailP <- source head;
+ data <- source "";
+
+ let
+ fun add () =
+ data <- get data;
+ data <- source data;
+ ndata <- source "";
+ tail <- get tailP;
+ tail' <- source Nil;
+
+ let
+ val cons = Cons {Data = data, NewData = ndata, Tail = tail'}
+ in
+ set tail cons;
+ set tailP tail';
+
+ head' <- get head;
+ case head' of
+ Nil => set head cons
+ | _ => return ()
+ end
+ in
+ return <xml><body>
+ <ctextbox source={data}/> <button value="Add" onclick={add ()}/><br/>
+ <br/>
+
+ <dyn signal={show head}/>
+ </body></xml>
+ end
diff --git a/demo/listEdit.urp b/demo/listEdit.urp
new file mode 100644
index 00000000..592e0546
--- /dev/null
+++ b/demo/listEdit.urp
@@ -0,0 +1,2 @@
+
+listEdit
diff --git a/demo/listEdit.urs b/demo/listEdit.urs
new file mode 100644
index 00000000..6ac44e0b
--- /dev/null
+++ b/demo/listEdit.urs
@@ -0,0 +1 @@
+val main : unit -> transaction page
diff --git a/lib/js/urweb.js b/lib/js/urweb.js
index c78229af..158e574d 100644
--- a/lib/js/urweb.js
+++ b/lib/js/urweb.js
@@ -59,10 +59,12 @@ function addNode(node) {
function runScripts(node) {
var savedScript = thisScript;
- var scripts = node.getElementsByTagName("script");
+ var scripts = node.getElementsByTagName("script"), scriptsCopy = {};
var len = scripts.length;
+ for (var i = 0; i < len; ++i)
+ scriptsCopy[i] = scripts[i];
for (var i = 0; i < len; ++i) {
- thisScript = scripts[i];
+ thisScript = scriptsCopy[i];
eval(thisScript.textContent);
}
diff --git a/src/elaborate.sml b/src/elaborate.sml
index c55593b4..5e94d8e4 100644
--- a/src/elaborate.sml
+++ b/src/elaborate.sml
@@ -704,7 +704,16 @@
(#fields s1, #fields s2)
(*val () = eprefaces "Summaries2" [("#1", p_summary env {fields = fs1, unifs = #unifs s1, others = #others s1}),
("#2", p_summary env {fields = fs2, unifs = #unifs s2, others = #others s2})]*)
+
val (unifs1, unifs2) = eatMatching (fn ((_, r1), (_, r2)) => r1 = r2) (#unifs s1, #unifs s2)
+ fun eatMost unifs =
+ case unifs of
+ (_, r) :: (rest as _ :: _) => (r := SOME (L'.CRecord (k, []), loc);
+ eatMost rest)
+ | _ => unifs
+ val unifs1 = eatMost unifs1
+ val unifs2 = eatMost unifs2
+
val (others1, others2) = eatMatching (consEq env) (#others s1, #others s2)
(*val () = eprefaces "Summaries3" [("#1", p_summary env {fields = fs1, unifs = unifs1, others = others1}),
("#2", p_summary env {fields = fs2, unifs = unifs2, others = others2})]*)
@@ -761,7 +770,7 @@
| _ => (fs1, fs2, others1, others2)
(*val () = eprefaces "Summaries5" [("#1", p_summary env {fields = fs1, unifs = unifs1, others = others1}),
- ("#2", p_summary env {fields = fs2, unifs = unifs2, others = others2})]*)
+ ("#2", p_summary env {fields = fs2, unifs = unifs2, others = others2})]*)
val clear = case (fs1, others1, fs2, others2) of
([], [], [], []) => true
diff --git a/src/jscomp.sml b/src/jscomp.sml
index 23b6e936..37bbf79d 100644
--- a/src/jscomp.sml
+++ b/src/jscomp.sml
@@ -409,6 +409,12 @@ fun process file =
Print.prefaces "Can't unurlify" [("t", MonoPrint.p_typ MonoEnv.empty t)];
("ERROR", st))
+ fun padWith (ch, s, len) =
+ if size s < len then
+ padWith (ch, String.str ch ^ s, len - 1)
+ else
+ s
+
fun jsExp mode skip outer =
let
val len = length outer
@@ -448,7 +454,16 @@ fun process file =
else
"\\074"
| #"\\" => "\\\\"
- | ch => String.str ch) s
+ | #"\n" => "\\n"
+ | #"\r" => "\\r"
+ | #"\t" => "\\t"
+ | ch =>
+ if Char.isPrint ch then
+ String.str ch
+ else
+ "\\" ^ padWith (#"0",
+ Int.fmt StringCvt.OCT (ord ch),
+ 3)) s
^ "\"")
| _ => str (Prim.toString p)
@@ -878,6 +893,15 @@ fun process file =
| EDml _ => unsupported "DML"
| ENextval _ => unsupported "Nextval"
| EUnurlify _ => unsupported "EUnurlify"
+ | EJavaScript (_, e as (EAbs _, _), _) =>
+ let
+ val (e, st) = jsE inner (e, st)
+ in
+ (strcat [str "\"cr(\"+ca(",
+ e,
+ str ")+\")\""],
+ st)
+ end
| EJavaScript (_, e, _) =>
let
val (e, st) = jsE inner (e, st)
diff --git a/src/monoize.sml b/src/monoize.sml
index 57bf26e3..131bdf67 100644
--- a/src/monoize.sml
+++ b/src/monoize.sml
@@ -1954,9 +1954,9 @@ fun monoExp (env, st, fm) (all as (e, loc)) =
loc)), loc), fm)
end
| SOME (_, src, _) =>
- (strcat [str "<script type=\"text/javascript\">inp(\"input\",",
+ (strcat [str "<span><script type=\"text/javascript\">inp(\"input\",",
(L'.EJavaScript (L'.Script, src, NONE), loc),
- str ")</script>"],
+ str ")</script></span>"],
fm))
| _ => (Print.prefaces "Targs" (map (fn t => ("T", CorePrint.p_con env t)) targs);
raise Fail "No name passed to textbox tag"))
@@ -2030,9 +2030,9 @@ fun monoExp (env, st, fm) (all as (e, loc)) =
str ")"]
val sc = setAttrs sc
in
- (strcat [str "<script type=\"text/javascript\">",
+ (strcat [str "<span><script type=\"text/javascript\">",
sc,
- str "</script>"],
+ str "</script></span>"],
fm)
end)