Вопрос

есть ли эквивалентный метод 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 ) для более гибкого интерфейса, если вы сначала убедились, что эти модули не выполняют внутреннюю буферизацию, которая испортит семантику нажатия символов.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top