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
,僅在 work
或 always
因例外而失敗時才應執行(通常是復原僅在函式正確完成時才有意義的使用者可見狀態變更)。例如
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
因例外而失敗,則會像往常一樣傳播。
如果 always
或 exceptionally
在內部使用例外來進行控制流程,但不引發例外,則 try_finally
會小心保留來自 work
或 always
的任何例外回溯,以便於除錯。
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 t
是 map f l @ t
,只是效率更高。
val rev_map_end : ('a -> 'b) -> 'a list -> 'b list -> 'b list
map_end f l t
是 map 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 s
將 s
解譯為類似「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 n
從 ic
讀取 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 a
將 n
向上捨入為 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
如果 n 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 <= b
則 p 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 str
將 str
中所有出現的 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 : |
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
計算字串 a
和 b
之間的編輯距離。為了提高效率,它使用了一個截止值:如果距離 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 l
將 l
中的行以兩欄列印,並以 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
typefilepath =
string
typemodname =
string
typecrcs =
(modname * Digest.t option) list
typealerts =
string Stdlib.String.Map.t