Вернуть персонажа в stdin в Ocaml
-
06-07-2019 - |
Вопрос
есть ли эквивалентный метод C ++ istream :: putback (char)
для OCaml?
Как я могу добавить символ в начало stdin ?
Решение
Вы не можете сделать это с помощью in_channel
или с помощью Stream.t
. Вот несколько предложений:
Если вы возвращаете прочитанный символ, вы можете использовать peek
для проверки потока вместо удаления элемента.
Возможно, вам повезет, если вы напрямую создадите C-интерфейс для этой функции. Я вижу, что это действительно плохая идея.
Рассматривали ли вы вместо этого аккумулятор?
Напишите модуль вокруг текущих функций с типом, который является застежкой-молнией или стеком, или некоторой другой структурой, которая позволяет отталкивать символы назад.
Другие советы
Батареи OCaml включены имеет гораздо более полный и гораздо более высокий интерфейс для потоков. Вы могли бы взглянуть на это. Плюс, как правило, это хорошо.
В основном: вы не можете. Батареи (и Extlib) обеспечивают расширенную оболочку ввода / вывода, но ни одна из них не поддерживает эту функцию.
Однако вы можете эмулировать его с помощью батарей или Extlib, если хотите выполнять только чтение на уровне символов, но оберните поток ввода-вывода в Enum ( BatEnum с батареями). Enum обеспечивает общее перечисление с «получить следующее значение» тип интерфейса, и позволяет перенести значения обратно в начало перечисления. Таким образом, вы можете заключить stdin в перечисление типа char Enum.t
, которое возвращает символы с помощью функции Enum.next
, а затем использовать Enum.push
вернуть нежелательные символы обратно на передний план.
После этого можно будет переписать такое перечисление с помощью IO ( BatIO ) для более гибкого интерфейса, если вы сначала убедились, что эти модули не выполняют внутреннюю буферизацию, которая испортит семантику нажатия символов.