Вопрос

Много external Объявления в стандартной библиотеке OCAML имеют % в начале имени функции, такие как определение int_of_float:

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

Что означает «%»?

Это было полезно?

Решение

Есть много %foo Специальные примитивы, скрытые в компиляторе. Я думаю, что лучший список доступен в bytecomp/translcore.ml, в источниках компилятора OCAML. Посмотрим, сколько я могу перечислить здесь:

  • Сравнения: %равные, %notequal, %меньше, %больше, чем меньше, %, %больше, %сравнения

Эти сравнения имеют специализированные версии для 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 Comporators (??): %eq, %noteq, %ltint, %leint, %gtint, %geint
  • Float Ops: %intoffloat, %floatofint, %negfloat, %absfloat, %addfloat, %subfloat, %mulfloat, %divfloat
  • Float Comporators: %eqfloat, %noteqfloat, %ltfloat, %lefloat, %gtfloat, %gefloat
  • String Ops: %string_length, %string_safe_get, %string_safe_set, %string_unsafe_get, %string_unsafe_set
  • Array Ops: %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 conversion: %nativeint_{of,to}_int32, int64_{of,to}_int32, int64_{of,to}_nativeint
  • Bigarray Operations: %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

Это все, что я могу найти.

Другие советы

Внешнее с % - это специальные внешние, которые будут обрабатываться специально компилятором. Например, с помощью int_of_float, OCAMLC составляет его в вызов некоторой функции C, но с OCAMLOPT он составит его в какой -то специальный ассемблер, который преобразует двойной в целое число.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top