将字符返回给Ocaml中的stdin

时间:2009-03-10 02:21:08

标签: ocaml stream-processing

是否与OCaml的C ++方法istream::putback(char)相当?

如何在 stdin 的开头添加一个字符?

3 个答案:

答案 0 :(得分:3)

您无法使用in_channelStream.t执行此操作。以下是一些建议:

  1. 如果要放回已读过的字符,可能需要使用use peek来检查流而不是删除元素。

  2. 您可能有幸直接为该功能编写C接口。我可以看到这是一个非常糟糕的主意。

  3. 您是否考虑过使用累加器?

  4. 使用拉链或堆栈类型或其他允许推回字符的结构在当前函数周围编写模块。

答案 1 :(得分:2)

OCaml Batteries Included为流提供了更全面,更高级别的界面。你可以看看这个。另外,一般来说,这很好。

答案 2 :(得分:1)

基本上:你不能。电池(和Extlib)提供增强的I / O包装,但它们都不支持此功能。

但是,如果您只愿意进行字符级读取,则可以使用Batteries或Extlib模拟它,将I / O流包裹在EnumBatEnum电池中) 。 Enum提供了一个带有“获取下一个值”类型接口的通用枚举,并允许您将值重新推送到枚举的前面。因此,您可以将stdin包装在char Enum.t类型的枚举中,该枚举返回带有Enum.next函数的字符,然后使用Enum.push将不需要的字符推回到它的前面。

如果你第一次验证那些模块没有执行内部缓冲会导致混乱,那么可以用IOBatIO)重新包装这样的enum以获得更灵活的接口推动角色的语义。