2009-12-16 9 views

risposta

11

Ci sono un sacco di primitive speciali %foo nascoste nel compilatore. Penso che la lista migliore sia disponibile in bytecomp/translcore.ml, nelle fonti del compilatore ocaml. Vediamo quante posso elencare qui:

  • Confronti:% pari,% NotEqual,% lessthan,% GreaterThan,% lessequal,% greaterequal,% confrontare le versioni

Queste comparative sono specializzate per int , float, string, nativeint, int32 e int64 e si specializzerà automaticamente se i tipi sono noti in fase di compilazione.

  • altre primitive: %identity, %ignore, %field0, %field1, %setfield0, %makeblock, %makemutable, %raise, %incr, %decr, %seqand, %seqor, %boolnot
  • ops Int: %negint, %succint, %predint, %addint, %subint, %mulint, %divint, %modint, %andint, %orint, %xorint, %lslint, %lsrint, %asrint
  • comparatori Int (??): %eq, %noteq, %ltint, %leint, %gtint, %geint
  • ops float: %intoffloat, %floatofint, %negfloat, %absfloat, %addfloat, %subfloat, %mulfloat, %divfloat
  • comparatori float: %eqfloat, %noteqfloat, %ltfloat, %lefloat, %gtfloat, %gefloat
  • ops String: %string_length, %string_safe_get, %string_safe_set, %string_unsafe_get, %string_unsafe_set
  • Operazioni di matrice: %array_length, %array_safe_get, %array_safe_set, %array_unsafe_get, %array_unsafe_set
  • manipolazione Oggetto: %obj_size, %obj_field, %obj_set_field, %obj_is_int
  • pigro: %lazy_force
  • nativeint, int32, OPS Int64: %{nativeint,int32,int64}: _of_int, _to_int, _neg, _add, _sub, _mul, _div, _mod, _and, _or, _xor, _lsl, _lsr, _asr
  • conversioni Int: %nativeint_{of,to}_int32, int64_{of,to}_int32, int64_{of,to}_nativeint
  • operazioni 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}
  • Object Oriented: %send, %sendself, %sendcache

Questo è tutto ciò che posso trovare.

8

esterno con% sono speciali esterni, che verranno gestiti appositamente dal compilatore. Ad esempio, con int_of_float, ocamlc lo compila in una chiamata di qualche funzione C, ma con ocamlopt, lo compilerà in qualche speciale opcode assembler che trasforma il doppio in intero.

+0

Mi chiedevo se potesse essere qualcosa del genere. Sai se questa funzione e i nomi magici disponibili sono documentati ovunque? –