Подтвердить что ты не робот

В OCaml, как я могу создать out_channel, который пишет в строку/буфер вместо файла на диске

У меня есть функция типа in_channel -> out_channel -> unit, которая выводит что-то в out_channel. Теперь я хотел бы получить его вывод как строку. Создание временных файлов для записи и чтения обратно кажется уродливым, так как я могу это сделать? Существуют ли другие методы создания out_channel помимо семейства Pervasives.open_out?

Собственно, эта функция реализовала repl. Мне действительно нужно протестировать его программно, поэтому я хотел бы сначала перенести его на функцию типа string -> string. Для создания in_channel кажется, что я могу использовать Scanf.Scanning.from_string, но я не знаю, как создать параметр out_channel.

4b9b3361

Ответ 1

Аккумуляторы OCaml имеют функции output_string и output_buffer в своем модуле BatIO, которые, похоже, делают то, что вы хотите: http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatIO.html

Возможно, вам понадобится использовать их типы ввода/вывода.

Ответ 2

Если вы не возражаете против своих тестов, полагающихся на модуль Unix, вы можете использовать Unix.pipe для создания пары дескрипторов файлов, создать in_channel с читаемой стороны, out_channel из записи и затем напишите строку на записываемую сторону и передайте in_channel в тестируемый код.

val pipe : unit -> file_descr * file_descr

Создайте трубку. Первый компонент результата открыт для считая, что выход в трубу. Второй компонент открыл для записи, что вход в трубу.

val in_channel_of_descr : file_descr -> Pervasives.in_channel

Создайте чтение входного канала из данного дескриптора. канал первоначально находится в двоичном режиме; использовать set_binary_mode_in ic false, если требуется текстовый режим.

val out_channel_of_descr : file_descr -> Pervasives.out_channel

Создайте запись выходного канала на данном дескрипторе. канал первоначально находится в двоичном режиме; используйте set_binary_mode_out oc false, если требуется текстовый режим.

Трубы Unix немного тяжелы для любого продукта с высокой пропускной способностью, но они должны быть хорошими для тестового жгута.