Вернуть персонажа в stdin в Ocaml - PullRequest
3 голосов
/ 10 марта 2009

есть ли эквивалент метода C ++ istream::putback(char) для OCaml?

Как добавить символ в начало stdin ?

Ответы [ 3 ]

3 голосов
/ 10 марта 2009

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

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

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

  3. Рассматривали ли вы вместо этого аккумулятор?

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

2 голосов
/ 16 января 2010

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

1 голос
/ 08 февраля 2010

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

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

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

...