题
是否有与OCaml的C ++方法 istream :: putback(char)
等价的内容?
如何在 stdin 的开头添加一个字符?
解决方案
您无法使用 in_channel
或使用 Stream.t
来执行此操作。以下是一些建议:
-
如果要放回已读过的字符,可能需要使用
peek
来检查流而不是删除元素。 -
您可能有幸直接为该功能编写C接口。我可以看到这是一个非常糟糕的主意。
-
您是否考虑过使用累加器?
-
使用拉链或堆栈类型或其他允许推回字符的结构在当前函数周围编写模块。
醇>
其他提示
包含OCaml电池为流提供了更加全面和更高级别的界面。你可以看看这个。另外,一般来说,这很好。
基本上:你不能。电池(和Extlib)提供增强的I / O包装,但它们都不支持此功能。
但是,如果您只愿意进行字符级读取,则可以使用Batteries或Extlib模拟它,在枚举( BatEnum 与电池)。枚举提供具有“获取下一个值”的通用枚举。接口类型,允许您将值重新推送到枚举的前面。因此,您可以将stdin包装在 char Enum.t
类型的枚举中,该枚举返回带有 Enum.next
函数的字符,然后使用 Enum.push
将不需要的角色推回到它的正面。
然后可以使用重新包装这样的枚举。 IO ( BatIO )提供更灵活的界面,如果你第一次验证那些模块不执行内部缓冲会破坏推送字符的语义。
不隶属于 StackOverflow