Многие объявления external в стандартной библиотеке OCaml имеют значение% в начале имени функции, например определение int_of_float:
external int_of_float : float -> int = "%intoffloat"
Что означает "%"?
Многие объявления external в стандартной библиотеке OCaml имеют значение% в начале имени функции, например определение int_of_float:
external int_of_float : float -> int = "%intoffloat"
Что означает "%"?
В компиляторе скрывается множество %foo специальных примитивов. Я думаю, что лучший список доступен в bytecomp/translcore.ml, в источниках ocaml-компилятора. Посмотрим, сколько я могу перечислить здесь:
Эти сравнения имеют специализированные версии для 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%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}: _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Это все, что я могу найти.
external с% являются специальными внешними, которые будут обрабатываться специально компилятором. Например, с int_of_float, ocamlc будет скомпилировать его в вызове некоторой функции C, но с ocamlopt он скомпилирует его в некоторый специальный код операции ассемблера, который преобразует double в integer.