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