Entry tags:
Решение для запуска REPL приложения
Я придумал решение для запуска REPL приложения, упомянутое в предыдущем посте. Напомню формулировку: есть интерактивная процедура на Си++ со следующим интерфейсом.
Процедура работает в стиле REPL: берет ввод из входного потока, обрабатывает, выдаёт результат в выходной поток и ждёт следующего ввода. Мы хотим запустить эту процедуру из нашей программы на Си++, посылать ей команды и получать результат. Это, в частности, полезно для автоматического тестирования. Примерно так:void application(std::istream &input, std::ostream &output);
Решение выглядит в виде класса Interact и работает следующим образом:send("foo\n");
std::string reply = receive();
REQUIRE(reply == "bar\n");
Исходники можно взять на Гитхабе: https://github.com/sergev/interactРеализация должна быть понятна из комментариев.#include "interact.h" Interact session(application);
REQUIRE(session.receive() == "Hello!\n");
session.send("foo\n");
REQUIRE(session.receive() == "bar\n");
no subject
В старом C++ его не было, а в других языках он обязателен.
Очень советую, помогает избежать ошибок из-за опечатки в имени метода или изменении типа аргумента.
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Ну это странный дизайн. А если я еще раз receive() вызову? Или это FSM, и каждый send изменяет статус, а потом receive возвращает аутпут в этом статусе? Не очевидно. По идее, это должна быть функция: вход -> выход, без всякого там state.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
> берет ввод из входного потока, обрабатывает, выдаёт результат в выходной поток и ждёт следующего ввода
Задумался о тупиках развития машинных языков. Второй вариант компилировался бы не хуже, а по понятности на 2..3 порядка лучше.