从 OCaml 中的元组中提取数据

Extracting data from a tuple in OCaml

我正在尝试使用 CIL 库来解析 C 源代码。我正在使用其名称搜索特定函数。

let cil_func = Caml.List.find (fun g ->
    match g with
    | GFun(f,_) when (equal f.svar.vname func) -> true
    | _ -> false
) cil_file.globals in
let body g = match g with GFun(f,_) -> f.sbody in
dumpBlock defaultCilPrinter stdout 1 (body cil_func)

所以我有一个 fundec * 位置的 GFun 类型,我正在尝试获取 fundec 的 sbody 属性。 进行第二次模式匹配似乎是多余的,更不用说,编译器抱怨它并不详尽。有更好的方法吗?

您可以定义自己的函数 returns 只是 fundec:

let rec find_fundec fname = function
| [] -> raise Not_found
| GFun (f, _) :: _ when equal (f.svar.vname fname) -> f (* ? *)
| _ :: t -> find_fundec fname t

那么你的代码看起来更像这样:

let cil_fundec = find_fundec func cil_file.globals in
dumpBlock defaultCilPrinter stdout 1 cil_fundec.sbody

尽管如此,标记为 (* ? *) 的行在我看来是错误的。我不明白为什么 f.svar.vname 会是一个函数。我只是在那里复制你的代码。

更新

修正了一个错误(我经常犯的错误),抱歉。