Nhiều external
tờ khai trong thư viện chuẩn OCaml có một% vào đầu tên hàm, chẳng hạn như định nghĩa của int_of_float
:% có nghĩa là gì trong khai báo bên ngoài OCaml?
external int_of_float : float -> int = "%intoffloat"
nào '%' nghĩa là gì?
Nhiều external
tờ khai trong thư viện chuẩn OCaml có một% vào đầu tên hàm, chẳng hạn như định nghĩa của int_of_float
:% có nghĩa là gì trong khai báo bên ngoài OCaml?
external int_of_float : float -> int = "%intoffloat"
nào '%' nghĩa là gì?
Có rất nhiều %foo
đặc biệt nguyên thủy ẩn trong trình biên dịch. Tôi nghĩ rằng danh sách tốt nhất có sẵn trong bytecomp/translcore.ml
, trong các nguồn trình biên dịch ocaml. Chúng ta hãy xem có bao nhiêu tôi có thể liệt kê ở đây:
Những so sánh này có chuyên môn cho int , float, string, nativeint, int32 và int64, và sẽ tự động chuyên nếu các kiểu được biết tại thời gian biên dịch.
%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
Đó là tất cả những gì tôi có thể tìm thấy.
bên ngoài với% là đặc biệt bên ngoài, sẽ được xử lý đặc biệt bởi trình biên dịch. Ví dụ, với int_of_float, ocamlc sẽ biên dịch nó thành một cuộc gọi của một số hàm C, nhưng với ocamlopt, nó sẽ biên dịch nó thành một số opcode lắp ráp đặc biệt để chuyển đổi gấp đôi thành số nguyên.
Tôi đã tự hỏi nếu nó có thể là một cái gì đó như thế. Bạn có biết liệu tính năng này và các tên ma thuật có sẵn được ghi lại ở bất kỳ đâu không? –