【问题标题】:What does % mean in an OCaml external declaration?OCaml 外部声明中的 % 是什么意思?
【发布时间】:2010-12-27 08:23:36
【问题描述】:

OCaml标准库中的很多external声明在函数名开头都有一个%,比如int_of_float的定义:

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

“%”是什么意思?

【问题讨论】:

    标签: external ocaml ffi


    【解决方案1】:

    编译器中隐藏着很多%foo 特殊原语。我认为最好的列表在 ocaml 编译器源代码中的 bytecomp/translcore.ml 中可用。让我们看看我可以在这里列出多少:

    • 比较:%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
    • Int 比较器 (??):%eq, %noteq, %ltint, %leint, %gtint, %geint
    • 浮动操作:%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_force
    • Nativeint,int32,int64 操作:%{nativeint,int32,int64}: _of_int, _to_int, _neg, _add, _sub, _mul, _div, _mod, _and, _or, _xor, _lsl, _lsr, _asr
    • 整数转换:%nativeint_{of,to}_int32, int64_{of,to}_int32, int64_{of,to}_nativeint
    • 大数组操作:%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

    我能找到的就这些了。

    【讨论】:

    • 我不确定它是否真的回答了“%”在外部声明中的含义。看@Remi的回答
    【解决方案2】:

    带有 % 的external 是特殊的external,将由编译器专门处理。 例如,使用 int_of_float,ocamlc 会将其编译为某个 C 函数的调用,但使用 ocamlopt,它将编译为一些特殊的汇编操作码,将双精度转换为整数。

    【讨论】:

    • 我想知道它是否可能是这样的。你知道这个功能和可用的魔法名称是否记录在任何地方?
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多