Цитата:
Применительно к оболочке я не вижу способа выполнять команды с помощью одного нажатия.
Вы узко мыслите. Можно запросто использовать контекстную подсказку. Как в командоре Нортона или командоре Волкова. А с учетом широкоформатного монитора её можно вообще разместить справа 3 панелью.
В Unix есть текстовый командер
Midnight_Commander.
А еще самая известнай утилита top, она тоже является программой с текстовым интерфейсом(TUI).
И есть тестовый редактор vi для ввода или изменения текста в файл. В скрипт или конфигурационный файл. vi тоже TUI, но не имеет подсказок из-за чего я его досихпор не освоил.
Вот для таких программ предусмотрены esc-коды в которых подмешивается цвет символов. А также команды для перемещения текстовый каретки в новую позицию(вы про goto спрашивали, вот это я и имел ввиду).
Я с вами согласен что пихать в консоль это не стоит.
Цитата:
По сути всё? Можно ещё что то простое придумать кроме ReadLn/WriteLn? А может быть и ReadLn лишний? Ведь если подумать, при работе со стандартными командами, они никогда не запрашивают дополнительного ввода.
Нужно знать назначения консоли.
В *nix это работа с файлами. А там команды сложные. К примеру Получить список файлов отсортировать его к примеру по типу. Взять файлы с нужном типом произвести поиск по содержимому. А после просуммировать размер файлов у которых есть вхождение.
Если суммарный размер меньше чем на диске D то скопировать файлы.
Не буду вдаваться в подробности. Но *unix утилиты таковы что обрабатывают поток команд. Он может меняться по ходу работы и быть бесконечным.
Так что нужно или нет решать вам. Но тогда вопрос для чего вам консоль?
Цитата:
Единственное что мне не нравится - это то, что если реализовывать ReadLn на, к примеру, delphi vcl, с формой и двумя memo, то придётся дёргать Application.ProcessMessages а после ввода строки в memo, непонятно как её вернуть из этого кода. Вернее способы то есть, но они кажутся какими то некрасивыми. Или главное чтобы работало? WriteLn кстати также потребует дёргать Application.ProcessMessages, чтобы отрисоваться непосредственно в момент своего вызова.
Честно не понял вопроса. Зачем вызывать Application.ProcessMessages и зачем возвращать?
Безусловно где-то внутри реализации memo вызывается аналог Application.ProcessMessages.
Есть мой любимый шаблон проектирования MCV (модель-контролёр-отображение). Практически любую программу можно разделить на 3 составляющие.
В Delphi достаточно фильтровать ввод(контролер). Складировать в модель вернее в переменную строкового типа. А по приходу enter отдавать модель(строку) на отображение.
Цитата:
И дело не в том, что кто то не владеет нужными навыками, а в том, чтобы не превращать цикл обработки команд (REPL) в кучку обработчиков, разбросанных по разным местам.
А в чем проблема? Отделите модель от составных элементов.
Тут под элементами я понимаю функции и другие модели которые раскиданы по модулям и библиотекам. Они независимы от вашей модели.
А модель это будет парсер команд и их интерпретатор.
Тут по сути интерпретатор можно назвать оболочкой над функциями из библиотек.
К примеру команда "дата?"
файл содержащий модуль датаКод:
TDate=record
день:ВДень;
месяц:ВМесяц;
год:ВГод;
end;
function GetDate:TDate;
function DateToStr(Date):String;
файл содержащий модуль консолиКод:
TCMDLex=record
qwery:String;
CMD:String;
Par1,par2,par3,par4:String;
end;
Обработчик команды 'дата?'
CmdDate;
begin
WriteLn(DateToStr(GetDate));
end;
//разборщик(парсер) командой строки
procedure ParseCMD(Cmd,CMDLex);
begin
...
end;
procedure DoCMD(CMDLex)
begin
if CmdLex.qwery='?' then
begin
Case CMD of
дата: CmdDate;
end; // case
end; // if
end;
файл содержащий модуль терминалаКод:
procedure MainLoop;
var
s:String;
begin
repeat
s:=ReadStr; // Читаем командную строку
ParseCMD(s, CMDLex);
DoCMD(CMDLex);
until False;
end;