vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2020-08-13 11:51 pm
Entry tags:

Решение для запуска REPL приложения

Я придумал решение для запуска 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Реализация должна быть понятна из комментариев.
ircicq: (Default)

[personal profile] ircicq 2020-08-14 07:58 am (UTC)(link)
Увидел, что Вы не используете "override specifier" ( https://en.cppreference.com/w/cpp/language/override)
В старом C++ его не было, а в других языках он обязателен.

Очень советую, помогает избежать ошибок из-за опечатки в имени метода или изменении типа аргумента.



spamsink: (Default)

[personal profile] spamsink 2020-08-14 03:31 pm (UTC)(link)
Класс!
juan_gandhi: (Default)

[personal profile] juan_gandhi 2020-08-14 04:52 pm (UTC)(link)

Ну это странный дизайн. А если я еще раз receive() вызову? Или это FSM, и каждый send изменяет статус, а потом receive возвращает аутпут в этом статусе? Не очевидно. По идее, это должна быть функция: вход -> выход, без всякого там state.

vlkamov: Рембрандт. Автопортрет с широко открытыми глазами. (Default)

[personal profile] vlkamov 2020-08-20 09:38 am (UTC)(link)
> void application(std::istream &input, std::ostream &output);

> берет ввод из входного потока, обрабатывает, выдаёт результат в выходной поток и ждёт следующего ввода

Задумался о тупиках развития машинных языков. Второй вариант компилировался бы не хуже, а по понятности на 2..3 порядка лучше.