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
相同,但也会搜索规范化的单元文件名,即如果 name 是 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”类型变量的值,并返回相应的目录列表。s
使用平台特定的分隔符分割,如果传递了 ~sep
,则使用 ~sep
分割。
如果 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 = 1 lsl s
(如果 n
是 2 的幂)。
val align : int -> int -> int
align n a
将 n
向上舍入为 a
的倍数(2 的幂)。
val no_overflow_add : int -> int -> bool
no_overflow_add n1 n2
返回 true
,如果 n1 + n2
的计算不会溢出。
val no_overflow_sub : int -> int -> bool
no_overflow_sub n1 n2
返回 true
,如果 n1 - n2
的计算不会溢出。
val no_overflow_mul : int -> int -> bool
no_overflow_mul n1 n2
返回 true
,如果 n1 * n2
的计算不会溢出。
val no_overflow_lsl : int -> int -> bool
no_overflow_lsl n k
返回 true
,如果 n lsl k
的计算不会溢出。
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,以 O(log(N)) 次调用 p
计算得出。
我们的实现支持两种情况,其中对 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
中用 after
替换 before
的所有出现,并返回生成的字符串。
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
的首次出现之后的子字符串。let (before, after) = String.cut_at s c in
如果
before ^ String.make 1 c ^ afters
包含 c
,则为恒等式。
如果字符未出现在字符串中,则引发 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
时,将每个 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
返回的选项之一。如果返回的列表为空,则不执行任何操作。
在调用 did_you_mean
之前,应该先输出一个易于理解的错误信息,这样即使产生提示很慢,用户也能得到一个清晰的失败通知。unit -> ...
的 thunk 机制用于将可能很慢的计算(通常是与当前环境中的许多内容计算编辑距离)推迟到需要打印提示消息时进行。
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
如果 b
为真,则 print_if ppf flag fmt x
会使用 fmt
在 ppf
上打印 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