let t = 関数型プログラミング言語ML 2
■ このスレッドは過去ログ倉庫に格納されています
0110デフォルトの名無しさん
NGNGtype graph = node list
(* 名前nameのノードか? *)
let is_node name n = let Node(id, _) = n in id = name
(* グラフgから名前nameのノードを探す。なければ追加する *)
let get_node g name =
try (List.find (is_node name) g, g)
with Not_found -> let n = Node(name, []) in (n, n::g)
(* グラフgの名前idのノードをnに更新する *)
let update_graph g id n =
List.fold_left (fun g' x -> if is_node id x then n::g' else x::g') [] g
(* n1のサクセッサにn2を追加する *)
let add_succ n1 n2 g =
let Node(id1, succ_list) = n1 in
let Node(id2, _) = n2 in
try let _ = List.find (is_node id2) succ_list in g
with Not_found -> update_graph g id1 (Node(id1, n2::succ_list))
(* 代入文 e1 = e2を処理し依存グラフを更新する *)
let process_assign stmt g =
let (left, right) = stmt in
let (n1, g') = get_node g left in
let (n2, g'') = get_node g' right in
add_succ n1 n2 g''
■ このスレッドは過去ログ倉庫に格納されています