OCaml外部声明中的%含义是什么?

Mic*_*and 13 ocaml external ffi

externalOCaml标准库中的许多声明在函数名称的开头都有%,例如int_of_float:

external int_of_float : float -> int = "%intoffloat"
Run Code Online (Sandbox Code Playgroud)

'%'是什么意思?

The*_*ema 12

%foo编译器中隐藏了许多特殊的原语.我认为最好的列表可以在bytecomp/translcore.mlocaml编译器源中找到.让我们看看我可以在这里列出多少:

  • 比较:%相等,%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
  • Int ops: %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 ops: %{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

这就是我能找到的全部.


Rém*_*émi 10

external with%是特殊的外部,由编译器专门处理.例如,使用int_of_float,ocamlc会将其编译为某个C函数的调用,但是使用ocamlopt,它会将其编译为一些特殊的汇编操作码,将double转换为整数.