模組 Misc

module Misc: sig .. end

雜項有用的類型和函式

警告:此模組不穩定,且為 compiler-libs 的一部分。


回報致命錯誤

val fatal_error : string -> 'a

使用給定的字串引發 Fatal_error 例外。

val fatal_errorf : ('a, Format.formatter, unit, 'b) format4 -> 'a

根據給定的格式字串格式化引數,並使用結果字串引發 Fatal_error

exception Fatal_error

例外處理和最終處理

val try_finally : ?always:(unit -> unit) -> ?exceptionally:(unit -> unit) -> (unit -> 'a) -> 'a

try_finally work ~always ~exceptionally 旨在執行 work 中的程式碼,此程式碼可能會因例外而失敗,並且有兩種清除常式:always,必須在函式任何執行後執行(通常是釋放系統資源),以及 exceptionally,僅在 workalways 因例外而失敗時才應執行(通常是復原僅在函式正確完成時才有意義的使用者可見狀態變更)。例如

      let objfile = outputprefix ^ ".cmo" in
      let oc = open_out_bin objfile in
      Misc.try_finally
        (fun () ->
           bytecode
           ++ Timings.(accumulate_time (Generate sourcefile))
               (Emitcode.to_file oc modulename objfile);
           Warnings.check_fatal ())
        ~always:(fun () -> close_out oc)
        ~exceptionally:(fun _exn -> remove_file objfile);
    

如果 exceptionally 因例外而失敗,則會像往常一樣傳播。

如果 alwaysexceptionally 在內部使用例外來進行控制流程,但不引發例外,則 try_finally 會小心保留來自 workalways 的任何例外回溯,以便於除錯。

val reraise_preserving_backtrace : exn -> (unit -> unit) -> 'a

reraise_preserving_backtrace e f 是 (f (); raise e) ,只是即使 f 在內部使用例外,也會保留目前的回溯。

列表操作

val map_end : ('a -> 'b) -> 'a list -> 'b list -> 'b list

map_end f l tmap f l @ t,只是效率更高。

val rev_map_end : ('a -> 'b) -> 'a list -> 'b list -> 'b list

map_end f l tmap f (rev l) @ t,只是效率更高。

val map_left_right : ('a -> 'b) -> 'a list -> 'b list

類似 List.map,具有保證的由左至右的評估順序

val for_all2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

List.for_all 相同,但適用於二元述詞。此外,此 for_all2 絕不會失敗:如果給定兩個長度不同的清單,則會傳回 false。

val replicate_list : 'a -> int -> 'a list

replicate_list elem n 是具有 n 個元素且所有元素都與 elem 相同的清單。

val list_remove : 'a -> 'a list -> 'a list

list_remove x l 傳回 l 的副本,其中第一個等於 x 的元素已移除。

val split_last : 'a list -> 'a list * 'a

傳回最後一個元素和給定清單的其他元素。

雜湊表操作

val create_hashtable : int -> ('a * 'b) list -> ('a, 'b) Hashtbl.t

建立具有給定初始大小的雜湊表,並使用給定的繫結填滿它。

標準函式庫的擴充

module Stdlib: sig .. end

檔案和檔案路徑操作

val find_in_path : string list -> string -> string

在目錄清單中搜尋檔案。

val find_in_path_rel : string list -> string -> string

在目錄清單中搜尋相對檔案。

val normalized_unit_filename : string -> string

將檔案名稱 Foo.ml 正規化為 foo.ml

val find_in_path_normalized : string list -> string -> string

Misc.find_in_path_rel 相同,但也會搜尋正規化的單元檔案名稱,亦即如果名稱為 Foo.ml,則允許 /path/Foo.ml/path/foo.ml 相符。

val remove_file : string -> unit

如果給定的檔案存在且為一般檔案,則將其刪除。對其他類型的檔案沒有任何作用。絕不會引發錯誤。

val expand_directory : string -> string -> string

expand_directory alt file 最終將檔案開頭的 + 展開為 alt(替代根目錄)

val split_path_contents : ?sep:char -> string -> string list

split_path_contents ?sep ss 解譯為類似「PATH」的變數值,並傳回對應的目錄清單。使用平台特定的分隔符號,或如果傳遞了 ~sep 則使用 ~sep 分割 s

如果 s 為空,則傳回空清單。

val copy_file : in_channel -> out_channel -> unit

copy_file ic oc 讀取檔案 ic 的內容並將其複製到 oc。當在 ic 上遇到 EOF 時,它會停止。

val copy_file_chunk : in_channel -> out_channel -> int -> unit

copy_file_chunk ic oc nic 讀取 n 個位元組並將其複製到 oc。當在 ic 上遇到 EOF 時,它會引發 End_of_file

val string_of_file : in_channel -> string

string_of_file ic 讀取檔案 ic 的內容並將其複製到字串。當在 ic 上遇到 EOF 時,它會停止。

val output_to_file_via_temporary : ?mode:open_flag list ->
string -> (string -> out_channel -> 'a) -> 'a

在暫存檔案中產生輸出,然後將其重新命名(盡可能以原子方式)為所需的輸出檔案名稱。output_to_file_via_temporary filename fn 開啟一個暫存檔案,並將其傳遞給 fn (名稱 + 輸出通道)。當 fn 傳回時,通道會關閉,暫存檔案會重新命名為 filename

val protect_writing_to_file : filename:string -> f:(out_channel -> 'a) -> 'a

開啟給定的 filename 以進行寫入(以二進位模式),將 out_channel 傳遞給給定的函式,然後關閉通道。如果函式引發例外,則會移除 filename

val concat_null_terminated : string list -> string

concat_null_terminated [x1;x2; ... xn]x1 ^ "\000" ^ x2 ^ "\000" ^ ... ^ xn ^ "\000"

val split_null_terminated : string -> string list

split_null_terminated s 類似於 String.split_on_char '\000',但會忽略尾隨分隔符號(如果有的話)

val chop_extensions : string -> string

傳回給定檔案名稱,但不包含其副檔名。副檔名是以句點開頭且不包含目錄分隔符號的最長後綴,例如 .xyz.uvw

如果給定的名稱不包含副檔名,則傳回該名稱。

整數操作

val log2 : int -> int

log2 n 傳回 s,使得如果 n 是 2 的乘冪,則 n = 1 lsl s

val align : int -> int -> int

align n an 向上捨入為 a 的倍數(2 的乘冪)。

val no_overflow_add : int -> int -> bool

如果 n1 + n2 的計算未溢位,則 no_overflow_add n1 n2 傳回 true

val no_overflow_sub : int -> int -> bool

如果 n1 - n2 的計算未溢位,則 no_overflow_sub n1 n2 傳回 true

val no_overflow_mul : int -> int -> bool

如果 n1 * n2 的計算未溢位,則 no_overflow_mul n1 n2 傳回 true

val no_overflow_lsl : int -> int -> bool

如果 lsl k 的計算未溢位,則 no_overflow_lsl n k 傳回 true

val letter_of_int : int -> string
module Int_literal_converter: sig .. end
val find_first_mono : (int -> bool) -> int

find_first_mono p 採用整數述詞 p : int -> bool,我們假設:1. 在自然數上是單調的:如果 a <= bp a 表示 p b,2. 對於範圍 0; max_int 中的某些自然數滿足此條件(這相當於:p max_int = true)。

find_first_mono p 是滿足 p 的最小自然數 N,在對 p 進行 O(log(N)) 次呼叫中計算得出。

我們的實作支援兩種不符合 p 的前提條件的情況

  • 如果 p 永遠為 false,我們會在不迴圈或當機的情況下靜默傳回 max_int
  • 如果 p 是非單調的但最終為 true,我們會傳回一些滿足條件的值。

字串操作

val search_substring : string -> string -> int -> int

search_substring pat str start 傳回字串 pat 在字串 str 中首次出現的位置。搜尋從 str 中的偏移量 start 開始。如果未出現 pat,則引發 Not_found

val replace_substring : before:string -> after:string -> string -> string

replace_substring ~before ~after strstr 中所有出現的 before 替換為 after,並傳回結果字串。

val rev_split_words : string -> string list

rev_split_words s 在空白分隔的單字中分割 s,並以相反的順序傳回單字清單。

val cut_at : string -> char -> string * string

String.cut_at s c 傳回一個配對,其中包含 s 中首次出現 c 之前的子字串,以及 s 中首次出現 c 之後的子字串。如果 s 包含 c,則 let (before, after) = String.cut_at s c in
    before ^ String.make 1 c ^ after
是同一性。

如果字元未出現在字串中,則引發 Not_found

val ordinal_suffix : int -> string

ordinal_suffix n 是附加到數值 n 作為序數的適當後綴:1 -> "st"2 -> "nd"3 -> "rd"4 -> "th",依此類推。正確處理較大的數字(例如,42 -> "nd")和數字 11-13(全部取得 "th")。

val normalise_eol : string -> string

normalise_eol s 傳回 s 的新副本,其中任何 '\r' 字元都已移除。適用於預先處理隨後將在執行 EOL 轉換的通道(亦即 Windows)上列印的文字

val delete_eol_spaces : string -> string

delete_eol_spaces s 傳回 s 的新副本,其中已移除任何行尾空格。適用於正規化測試的頂層輸出。

參考操作

type ref_and_value = 
| R : 'a ref * 'a -> ref_and_value
val protect_refs : ref_and_value list -> (unit -> 'a) -> 'a

protect_refs l f 在執行 f 時,會暫時將 l 中每個 R (r, v)r 設定為 v。即使 f 引發例外,參考的先前內容也會還原,而不會改變例外回溯。

val get_ref : 'a list ref -> 'a list

get_ref lr 傳回列表參考 lr 的內容,並將其內容重設為空列表。

val set_or_ignore : ('a -> 'b option) -> 'b option ref -> 'a -> unit

set_or_ignore f opt x 如果 f x 傳回 Some _,則將 opt 設定為 f x,如果傳回 None,則保持不變。

三元組和四元組操作

val fst3 : 'a * 'b * 'c -> 'a
val snd3 : 'a * 'b * 'c -> 'b
val thd3 : 'a * 'b * 'c -> 'c
val fst4 : 'a * 'b * 'c * 'd -> 'a
val snd4 : 'a * 'b * 'c * 'd -> 'b
val thd4 : 'a * 'b * 'c * 'd -> 'c
val for4 : 'a * 'b * 'c * 'd -> 'd

拼字檢查和「您是不是要找」建議

val edit_distance : string -> string -> int -> int option

edit_distance a b cutoff 計算字串 ab 之間的編輯距離。為了提高效率,它使用了一個截止值:如果距離 d 小於 cutoff,則傳回 Some d,否則傳回 None

目前使用的距離演算法是 Damerau-Levenshtein:它計算從一個單字轉換到另一個單字所需的字母插入、刪除、替換或相鄰字母交換的次數。特定的演算法未來可能會更改。

val spellcheck : string list -> string -> string list

spellcheck env name 接受一個目前環境中存在的名稱列表 env 和一個錯誤的 name,並傳回從 env 中取得的建議列表,這些建議與 name 足夠接近,可能是其中一個的錯字。

val did_you_mean : Format.formatter -> (unit -> string list) -> unit

did_you_mean ppf get_choices 提示使用者可能想表達的是呼叫 get_choices 傳回的選項之一。如果傳回的列表為空,則不執行任何操作。

使用 unit -> ... 的 thunking 旨在延遲任何可能較慢的計算(通常是計算與目前環境中許多項目的編輯距離),直到要列印提示訊息時才執行。您應該在呼叫 did_you_mean 之前列印易於理解的錯誤訊息,以便使用者即使產生提示的速度很慢,也能清楚地收到失敗通知。

module Color: sig .. end

色彩支援偵測

終端輸出樣式處理

module Style: sig .. end
module Error_style: sig .. end

格式化輸出

val print_if : Format.formatter ->
bool ref -> (Format.formatter -> 'a -> unit) -> 'a -> 'a

print_if ppf flag fmt x 如果 b 為 true,則在 ppf 上使用 fmt 列印 x

val pp_two_columns : ?sep:string ->
?max_lines:int -> Format.formatter -> (string * string) list -> unit

pp_two_columns ?sep ?max_lines ppf ll 中的行以兩欄列印,並以 sep 分隔(預設為 "|")。 max_lines 可用於指示要列印的最大行數 -- 如果輸入的行數太多,則會在中間插入省略符號。

範例

pp_two_columns ~max_lines:3 Format.std_formatter [
      "abc", "hello";
      "def", "zzz";
      "a"  , "bllbl";
      "bb" , "dddddd";
    ]

列印

    abc | hello
    ...
    bb  | dddddd
   
val print_see_manual : Format.formatter -> int list -> unit

請參閱手冊章節

顯示組態變數

val show_config_and_exit : unit -> unit

顯示模組 Config 中所有編譯器配置變數的值,然後以代碼 0 結束程式。

val show_config_variable_and_exit : string -> unit

顯示給定配置變數的值,然後以代碼 0 結束程式。

建置映射處理

建立映射會導致編譯器正規化物件檔案中嵌入的檔案名稱,從而產生更具可重現性的建置。

val get_build_path_prefix_map : unit -> Build_path_prefix_map.map option

傳回在 BUILD_PATH_PREFIX_MAP 環境變數中編碼的映射。

val debug_prefix_map_flags : unit -> string list

傳回要傳遞給組譯器的 --debug-prefix-map 旗標列表,該列表從 BUILD_PATH_PREFIX_MAP 環境變數建立。

魔術數字處理

module Magic_number: sig .. end

雜項類型別名

type filepath = string 
type modname = string 
type crcs = (modname * Digest.t option) list 
type alerts = string Stdlib.String.Map.t