В 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
.
Ответы
Ответ 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 немного тяжелы для любого продукта с высокой пропускной способностью, но они должны быть хорошими для тестового жгута.