2009-03-10 3 views

ответ

3

Вы не можете сделать это с помощью in_channel или с Stream.t. Вот некоторые предложения:

  1. Если вы кладете обратно символ, который вы гласили, вы можете использовать использовать peek изучить поток вместо удаления элемента.

  2. Возможно, вам удастся напрямую написать C-интерфейс для этой функции. Я вижу, что это очень плохая идея.

  3. Вы считали, что вместо этого используете аккумулятор?

  4. Напишите модуль вокруг текущих функций с типом, который представляет собой застежку-молнию или стек или другую структуру, которая позволяет отталкивать символы назад.

2

OCaml Batteries Included имеет гораздо более полный и многоуровневый интерфейс для потоков. Вы можете взглянуть на это. Плюс, в общем, это хорошо.

+0

Батареи хорошие, но не поддерживают (напрямую) эту функцию с помощью потоков ввода-вывода. –

+0

Действительно, но абстракция IO не мешает этому, противопоставляя абстракцию ввода-вывода в стандартной библиотеке OCaml. Поэтому его можно добавить, что лучше, чем ничего. – Yoric

1

В принципе: вы не можете. Батареи (и Extlib) обеспечивают расширенную оболочку ввода-вывода, но ни одна из них не поддерживает эту функцию.

Вы можете, однако, эмулировать его либо с помощью батарей, либо с помощью Extlib, если вы готовы выполнять только чтение на уровне символов, bu обертывая поток ввода-вывода в Enum (BatEnum с батареями). Enum предоставляет общее перечисление с типом интерфейса «получить следующее значение» и позволяет вам возвращать значения обратно в начало перечисления. Таким образом, вы можете обернуть stdin в перечисление типа char Enum.t, который возвращает символы с его функцией Enum.next, а затем используйте Enum.push, чтобы направить нежелательные символы на передний план.

Возможно затем повторно завернуть такое перечисление с IO (BatIO) для более гибкого интерфейса, если вы первый проверить, что эти модули не выполняют внутреннюю буферизацию, что бы испортить семантику толкающих символов.

Смежные вопросы