- 動いてると思うけど書き殴りだから細かいことは気にしないでね
- 単に機能が増えて面倒になっただけで、状態渡しのしかたは前回と同じ。
- メインループではなくハンドラでOCaml部分の状態渡しをしてるので、「メインループを書き直してるからスケールしない」というのとは少し違う。
- (状態渡しや関数型云々とは無関係に)やっぱりDOMかつ静的型だとちょっと長くなるね(定数倍ファクターなのでスケール云々とも無関係)。
- 俺もOCamlの勉強になったけど、「できない」と断言されたことをすぐにやって見せたんだから(それも3回。しかも他人に「課題」とか言った本人は1年がかり、かつ関数型ではなく全くの命令型。決して認めないようだが。)、もうつきあう義理はないよね。
- 「中国製不正アクセス機器を使って誹謗中傷してる犯罪者集団」みたいな妄想はマジ勘弁。それを釣りで煽ってる奴ら(単独?)もな。
DoNe2
List#1
module H = Dom_html
let g x = Js.Opt.get x (fun () -> assert false)
let o x = Js.Opt.return x
let s = Js.string
let i = string_of_int
type ('a, 'b) state =
(* just to omit explicit annotation of complex types by (ab)using "polymorphism" *)
{ itemss : 'a list list; cur : int; selects : 'b }
let _ = H.window##onload <- H.handler (fun _ ->
Firebug.console##debug(s "DoNe2 starting");
let d = H.document in
let tm = g (d##getElementById (s "todo2_time")) in
ignore
(H.window##setInterval
(Js.wrap_callback (fun _ ->
tm##textContent <- o (jsnew Js.date_now ()##toString ())),
100.));
let nu = g (H.CoerceTo.input (g (d##getElementById (s "todo2_new")))) in
let selects = g (d##getElementById (s "todo2_selects")) in
let select1 = g (H.CoerceTo.input (g (d##getElementById (s "todo2_select1")))) in
let selected = g (d##getElementById (s "todo2_selected")) in
let input = g (H.CoerceTo.input (g (d##getElementById (s "todo2_input")))) in
let go = g (H.CoerceTo.input (g (d##getElementById (s "todo2_go")))) in
let ul = g (H.CoerceTo.ul (g (d##getElementById (s "todo2_ul")))) in
(* ここまでDOMの準備。ここから本体 *)
let rec generate_handlers st =
let rec handle_sub _ =
let v = input##value in
let rec add_v pos = function (* 補助関数 *)
| [] -> assert false
| items :: itemss when pos = 1 -> (items @ [v]) :: itemss
| items :: itemss -> items :: add_v (pos - 1) itemss in
let new_itemss = add_v st.cur st.itemss in
Firebug.console##debug(s ("DoNe2 adding to List#" ^ i st.cur ^ ": " ^ Js.to_string v));
input##value <- s "";
configure_ui { st with itemss = new_itemss };
Js._false
and handle_nu _ =
let new_list = H.createInput ~_type:(s "submit") d in
let new_selects = st.selects @ [new_list] in
let new_itemss = st.itemss @ [[]] in
let new_cur = List.length new_selects in
new_list##value <- s ("List#" ^ i new_cur);
Dom.appendChild selects new_list;
configure_ui { (* st with *) itemss = new_itemss; cur = new_cur; selects = new_selects };
Js._false
and handle_select new_cur _ =
configure_ui { st with cur = new_cur };
Js._false
in
(handle_sub, handle_nu, handle_select)
and configure_ui st =
selected##textContent <- o (s ("List#" ^ i st.cur));
go##value <- s ("NewDoNe#" ^ i (1 + List.length (List.nth st.itemss (st.cur - 1))));
let rec rm_all_child p = (* 補助関数 *)
Js.Opt.case (p##firstChild) (fun () -> ())
(fun c ->
ignore (p##removeChild(c));
rm_all_child p) in
rm_all_child ul;
List.iter
(fun item ->
let li = H.createLi d in
li##textContent <- o item;
Dom.appendChild ul li)
(List.nth st.itemss (st.cur - 1));
let (handle_sub, handle_nu, handle_select) = generate_handlers st in
go##onclick <- H.handler handle_sub;
nu##onclick <- H.handler handle_nu;
List.iteri
(fun n selected ->
selected##onclick <- H.handler (handle_select (1 + n)))
st.selects
in
configure_ui { itemss = [[]]; cur = 1; selects = [select1] };
Js._false)
0 件のコメント:
コメントを投稿