为什么Core.Std会弃用`close_in`和`close_out`函数?

时间:2014-10-30 17:01:00

标签: ocaml ocaml-core

如果我open Core.Std,尝试使用close_out函数关闭out_channel会给我一个错误,因为Core会更改close_out的类型签名以给我一个弃用错误消息。

close_out;;
- : [ `Deprecated_use_out_channel ] -> [ `Deprecated_use_out_channel ] = <fun>

第一个问题:为什么Core弃用close_out已弃用但未弃用close_out_noerr

第二个问题: Core是否仍然希望我使用in_channelout_channel,还是更喜欢我使用不同的API进行IO?

第三个问题:我能找到的唯一其他IO API是read模块中的writeUnix等函数,它们代替文件描述符文件句柄。在C中,文件描述符函数直接发出syscalls,而接收FILE *的stdio.h中的函数执行缓冲IO。这与Ocaml中的类似,Unix模块中的函数直接发出系统调用,而使用in_channelout_channel的函数是否会缓冲IO?

2 个答案:

答案 0 :(得分:3)

基本IO在Out_channelIn_channel模块中实现,它们定义了旧out_channelin_channel类型的新接口。由于类型相同,因此它是一个薄的覆盖层,可以与任何其他库平滑地互操作。

关于close_out_noerr,看起来他们只是错过了它。在genral中,使用Core时应该忘记OCaml标准库,并且只使用后者提供的工具。如果您确实需要旧标准库,可以使用Caml模块。

答案 1 :(得分:3)

如果你看一下Real World Ocaml书, 作者似乎广泛使用In_channelOut_channel模块。 使用Ocaml普及函数不再打开/关闭文件,而是使用 In_channel.closeOut_channel.close函数。

问题是如果在读取文件时引发异常,程序员必须在捕获到异常时关闭打开的文件。打开的文件没有垃圾收集器的等价物。使用In_channel.with_file可以处理正确的文件关闭,即使引发了异常。