是否有OCaml'@@'运算符,这是什么意思?

Joh*_*lén 4 ocaml

我是OCaml n00b并尝试理解以下源文件:

https://github.com/BinaryAnalysisPlatform/bap/blob/master/lib/bap_disasm/bap_disasm_shingled.ml

在第46行,有以下代码:

let static_successors gmin gmax lmem insn =
  let fall_through =
    if not (is_exec_ok gmin gmax lmem) then [None, `Fall]
    else
      let i = Word.((Memory.min_addr lmem) ++ (Memory.length lmem)) in      
      [Some i, `Fall] in
  if (Insn.may_affect_control_flow insn) then (
    let targets = (Insn.bil insn |> dests_of_bil) in
    if (not @@ Insn.is_unconditional_jump insn) then
      List.append fall_through targets
    else
      targets
  ) else fall_through
Run Code Online (Sandbox Code Playgroud)

我得到了大部分这个功能的要点,但是这个if (not @@ Insn.is_unconditional_jump insn部分让我很难受.我似乎找不到@@运算符/函数的引用; 它似乎以insn某种方式将该函数应用于实例.

那么,是@@一个内置的运营商,如果是这样,它做什么?如果没有,我怎么能找到操作员/功能的声明,所以我可以找到它并弄明白?

Pat*_*atJ 5

该操作符Pervasives在4.01中引入("始终打开"模块).

基本上,它是类型('a -> 'b) -> 'a -> 'b.所以f @@ x相当于f x.

好处是它的相关性和优先性.

在这种特定情况下,not @@ Insn.is_unconditional_jump insn完全相同not (Insn.is_unconditional_jump insn).

它被声明为内部基元,因此对您没有多大帮助,但您可以在OCaml手册中看到有关它的信息.

  • 我明白了,这就像Haskell的`$`,所以它只是强烈控制函数应用的优先级。 (2认同)