代码之家  ›  专栏  ›  技术社区  ›  Michael Ekstrand

%在OCAML外部声明中是什么意思?

  •  11
  • Michael Ekstrand  · 技术社区  · 16 年前

    许多 external ocaml标准库中的声明在函数名的开头有一个百分比,例如 int_of_float :

    external int_of_float : float -> int = "%intoffloat"
    

    “%”是什么意思?

    2 回复  |  直到 16 年前
        1
  •  11
  •   Thelema    16 年前

    有很多 %foo 隐藏在编译器中的特殊原语。我想最好的名单在 bytecomp/translcore.ml 在ocaml编译器源中。让我们看看我可以在这里列出多少:

    • 比较:%equal%,%notequal%,%lessthan%,%greaterthan%,%lessequal%,%greaterequal%,%compare

    这些比较有专门的int、float、string、nativeint、int32和int64版本,如果在编译时知道这些类型,它们将自动专门化。

    • 其他原语: %identity, %ignore, %field0, %field1, %setfield0, %makeblock, %makemutable, %raise, %incr, %decr, %seqand, %seqor, %boolnot
    • 国际奥委会: %negint, %succint, %predint, %addint, %subint, %mulint, %divint, %modint, %andint, %orint, %xorint, %lslint, %lsrint, %asrint
    • 整数比较器(??) %eq, %noteq, %ltint, %leint, %gtint, %geint
    • 浮动OPS: %intoffloat, %floatofint, %negfloat, %absfloat, %addfloat, %subfloat, %mulfloat, %divfloat
    • 浮球比较器: %eqfloat, %noteqfloat, %ltfloat, %lefloat, %gtfloat, %gefloat
    • 字符串运算: %string_length, %string_safe_get, %string_safe_set, %string_unsafe_get, %string_unsafe_set
    • 数组运算: %array_length, %array_safe_get, %array_safe_set, %array_unsafe_get, %array_unsafe_set
    • 对象操作: %obj_size, %obj_field, %obj_set_field, %obj_is_int
    • Lazy: %lazy_force
    • NativeInt、Int32、Int64操作: %{nativeint,int32,int64}: _of_int, _to_int, _neg, _add, _sub, _mul, _div, _mod, _and, _or, _xor, _lsl, _lsr, _asr
    • int转换: %nativeint_{of,to}_int32, int64_{of,to}_int32, int64_{of,to}_nativeint
    • BigArray操作: %caml_ba_ref_{1,2,3}, %caml_ba_set_{1,2,3}, %caml_ba_unsafe_ref_{1,2,3}, %caml_ba_unsafe_set_{1,2,3}
    • 面向对象: %send, %sendself, %sendcache

    我只能找到这些。

        2
  •  8
  •   Rémi    16 年前

    带有%的外部是特殊的外部,编译器将专门处理它。 例如,对于int-of-float,ocamlc将把它编译成某个c函数的调用,但是对于ocamlopt,它将把它编译成一些特殊的汇编程序操作码,这些汇编程序操作码可以将double转换成integer。