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) -> 'atry_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) -> 'areraise_preserving_backtrace e f 等于 (f (); raise e),只是保留了当前回溯,即使 f 在内部使用异常。
val map_end : ('a -> 'b) -> 'a list -> 'b list -> 'b listmap_end f l t 等于 map f l @ t,只是更高效。
val rev_map_end : ('a -> 'b) -> 'a list -> 'b list -> 'b listmap_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 listreplicate_list elem n 是一个列表,其中包含 n 个元素,所有元素都与 elem 相同。
val list_remove : 'a -> 'a list -> 'a listlist_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 -> stringexpand_directory alt file 最终将文件开头的 + 扩展为 alt(备用根目录)
val split_path_contents : ?sep:char -> string -> string listsplit_path_contents ?sep s 将 s 解释为“PATH”类型变量的值,并返回相应的目录列表。s 使用平台特定的分隔符分割,如果传递了 ~sep,则使用 ~sep 分割。
如果 s 为空,则返回空列表。
val copy_file : in_channel -> out_channel -> unitcopy_file ic oc 读取文件 ic 的内容并将其复制到 oc。在遇到 ic 上的 EOF 时停止。
val copy_file_chunk : in_channel -> out_channel -> int -> unitcopy_file_chunk ic oc n 从 ic 读取 n 个字节,并将它们复制到 oc。在遇到 ic 上的 EOF 时引发 End_of_file。
val string_of_file : in_channel -> stringstring_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 -> stringconcat_null_terminated [x1;x2; ... xn] 等于 x1 ^ "\000" ^ x2 ^ "\000" ^ ... ^ xn ^ "\000"
val split_null_terminated : string -> string listsplit_null_terminated s 类似于 String.split_on_char '\000',但忽略了尾随分隔符(如果有)。
val chop_extensions : string -> string返回给定文件名,不包括其扩展名。扩展名是所有以句点开头且不包括目录分隔符的最长后缀,例如 .xyz.uvw。
如果给定名称不包含扩展名,则返回该名称。
val log2 : int -> intlog2 n 返回 s,使得 n = 1 lsl s(如果 n 是 2 的幂)。
val align : int -> int -> intalign n a 将 n 向上舍入为 a 的倍数(2 的幂)。
val no_overflow_add : int -> int -> boolno_overflow_add n1 n2 返回 true,如果 n1 + n2 的计算不会溢出。
val no_overflow_sub : int -> int -> boolno_overflow_sub n1 n2 返回 true,如果 n1 - n2 的计算不会溢出。
val no_overflow_mul : int -> int -> boolno_overflow_mul n1 n2 返回 true,如果 n1 * n2 的计算不会溢出。
val no_overflow_lsl : int -> int -> boolno_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) -> intfind_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 -> intsearch_substring pat str start 返回字符串 pat 在字符串 str 中首次出现的 位置。搜索从 str 中的偏移量 start 开始。如果 pat 不出现,则引发 Not_found。
val replace_substring : before:string -> after:string -> string -> stringreplace_substring ~before ~after str 在 str 中用 after 替换 before 的所有出现,并返回生成的字符串。
val rev_split_words : string -> string listrev_split_words s 将 s 分割为以空格分隔的单词,并以相反的顺序返回单词列表。
val cut_at : string -> char -> string * stringString.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 -> stringordinal_suffix n 是应附加到数字 n 作为序数的适当后缀:1 -> "st",2 -> "nd",3 -> "rd",4 -> "th",依此类推。正确处理较大的数字(例如,42 -> "nd")和数字 11-13(它们都得到 "th")。
val normalise_eol : string -> stringnormalise_eol s 返回 s 的一个新副本,其中所有 '\r' 字符都被删除。用于预处理将在随后打印到执行 EOL 变换的通道(即 Windows)上的文本
val delete_eol_spaces : string -> stringdelete_eol_spaces s 返回 s 的一个新副本,其中所有行尾空格都被删除。用于规范化顶层的输出以进行测试。
type ref_and_value =
| |
R : |
val protect_refs : ref_and_value list -> (unit -> 'a) -> 'aprotect_refs l f 在执行 f 时,将每个 R (r, v) 临时设置为 r 到 v。即使 f 引发异常,也会恢复引用的先前内容,而不会改变异常回溯。
val get_ref : 'a list ref -> 'a listget_ref lr 返回列表引用 lr 的内容,并将它的内容重置为空列表。
val set_or_ignore : ('a -> 'b option) -> 'b option ref -> 'a -> unitset_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 -> 'dval edit_distance : string -> string -> int -> int optionedit_distance a b cutoff 计算字符串 a 和 b 之间的编辑距离。为了提高效率,它使用了一个截止值:如果距离 d 小于 cutoff,则返回 Some d,否则返回 None。
当前使用的距离算法是 Damerau-Levenshtein:它计算从一个词到另一个词所需的插入、删除、替换字母或交换相邻字母的次数。该特定算法在将来可能会更改。
val spellcheck : string list -> string -> string listspellcheck env name 获取当前环境中存在的名称列表 env 和一个错误的 name,并返回从 env 中获取的建议列表,这些建议与 name 足够接近,可能是它的一个拼写错误。
val did_you_mean : Format.formatter -> (unit -> string list) -> unitdid_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 -> unitpp_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