3

是否有等效istream::putback(char)于 OCaml 的 C++ 方法?

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

4

3 回答 3

3

你不能用in_channel或来做Stream.t。以下是一些建议:

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

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

  3. 您是否考虑过使用蓄能器?

  4. 围绕当前函数编写一个模块,其类型为拉链或堆栈或其他允许将字符推回的结构。

于 2009-03-10T17:19:53.527 回答
2

OCaml Batteries Included具有更全面和更高级别的流接口。你可以看看这个。另外,总的来说,这很好。

于 2010-01-16T10:44:35.670 回答
1

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

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

It may be possible then to re-wrap such an enum with IO (BatIO) for a more flexible interface, if you first verified that those modules don't perform internal buffering that would mess up the semantics of pushing characters.

于 2010-02-08T04:30:29.357 回答