模块 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 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 ss 解释为“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 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 = 1 lsl s(如果 n 是 2 的幂)。

val align : int -> int -> int

align n an 向上舍入为 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,如果 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 strstr 中用 after 替换 before 的所有出现,并返回生成的字符串。

val rev_split_words : string -> string list

rev_split_words ss 分割为以空格分隔的单词,并以相反的顺序返回单词列表。

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

String.cut_at s c 返回一个对,其中包含 sc 的首次出现之前的子字符串,以及 sc 的首次出现之后的子字符串。let (before, after) = String.cut_at s c in
    before ^ String.make 1 c ^ after
如果 s 包含 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 : 'a ref * 'a -> ref_and_value
val protect_refs : ref_and_value list -> (unit -> 'a) -> 'a

protect_refs l f 在执行 f 时,将每个 R (r, v) 临时设置为 rv。即使 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 返回的选项之一。如果返回的列表为空,则不执行任何操作。

在调用 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 会使用 fmtppf 上打印 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