2020-08-13

vak: (Default)
А кто там идет по болотам и лесам
Огромной такою толпой?
Белорусы.
А что они несут на худых плечах,
Что подняли они на худых руках?
Свою кривду.
А куда они несут эту кривду всю,
А кому они несут напоказ свою?
На свет божий.
А кто ж это их, не один миллион, —
Кривду несть научил, разбудил их сон?
Нужда, горе.
А чего ж теперь захотелось им,
Угнетенным века, им, слепым и глухим?
Людьми зваться.
vak: (Default)
Я придумал решение для запуска REPL приложения, упомянутое в предыдущем посте. Напомню формулировку: есть интерактивная процедура на Си++ со следующим интерфейсом.
void application(std::istream &input, std::ostream &output);
Процедура работает в стиле REPL: берет ввод из входного потока, обрабатывает, выдаёт результат в выходной поток и ждёт следующего ввода. Мы хотим запустить эту процедуру из нашей программы на Си++, посылать ей команды и получать результат. Это, в частности, полезно для автоматического тестирования. Примерно так:
send("foo\n");
std::string reply = receive();
REQUIRE(reply == "bar\n");
Решение выглядит в виде класса Interact и работает следующим образом:
#include "interact.h"

Interact session(application);
REQUIRE(session.receive() == "Hello!\n");

session.send("foo\n");
REQUIRE(session.receive() == "bar\n");
Исходники можно взять на Гитхабе: https://github.com/sergev/interactРеализация должна быть понятна из комментариев.