函数在OCaml

时间:2015-05-13 03:14:12

标签: ocaml

我正在修改facebook / pfff工具,特别是this file

我在graph_code_java.ml中附加详细信息(节点和边缘),以及在两个单独的文件中遇到节点和顶点的时间:Edges.json和GraphSON.json。

最后,在执行完所有内容后,我调用了函数cleanup_graphson,它将Edges.json和GraphSON.json合并。

以下是我修改后graph_code_java的样子:

let build ?(verbose=true) ?(only_defs=false) root files =
  let g = G.create () in
  G.create_initial_hierarchy g;

  let lookup_fails = Common2.hash_with_default (fun () -> 0) in

(* step1: creating the nodes and 'Has' edges, the defs *)
...
(* step3: creating the 'Use' edges that can rely on recursive inheritance   *)
if verbose then pr2 "\nstep3: extract uses";
files +> Console.progress ~show:verbose (fun k ->
List.iter (fun file ->
 k();
 let readable = Common.readable ~root file in
 let ast = parse ~show_parse_error:false file in
 extract_defs_uses ~phase:Uses ~g ~ast ~readable ~lookup_fails;
));
end;
(* step 4: Merge Edges.json and GraphSON.json *)
if !write_to_graphson = true then
  begin
    pr "cleaning up";
    GS.cleanup_graphson;
  end;
g

cleanup_graphson函数如下所示:

let cleanup_graphson =
  pr "Cleaning up!";
  Common.append_file "GraphSON.json" "] \n";
  Common.append_file "Edges.json" "] \n";
  let str = Common.read_file "Edges.json" in
  Common.append_file "GraphSON.json" str

但是当我运行程序时,cleanup_graphson在其他所有内容之前被称为(步骤1,步骤2,步骤3)。除此之外,所有其他步骤都按顺序运行。我不确定为什么会这样,是因为正在执行文件操作?还有其他人遇到过这个问题吗?

P.S:Console.progress的代码是here

感谢您查看我的问题!

2 个答案:

答案 0 :(得分:3)

cleanup_graphson是一个变量,而不是一个函数。当我将其修改为下面时,它按顺序执行。我在cleanup_graphson中添加了一个()作为参数。

let cleanup_graphson ()=
  pr "Cleaning up!";
  Common.append_file "GraphSON.json" "] \n";
  Common.append_file "Edges.json" "] \n";
  let str = Common.read_file "Edges.json" in
  Common.append_file "GraphSON.json" str

答案 1 :(得分:2)

除非您专门使用多线程,否则任何代码都不会异步执行。

在不知道任何有关此代码的情况下,我怀疑存在缓冲问题。也许计算按照您期望的顺序进行,但pr的输出在其他输出之前出现。当程序使用两种截然不同的写输出方式时,这很容易发生。