Понял, что во-первых, нужно менять модуль мета, чтобы добавить к нему константы. Меня не интересует экономия памяти в таких объемах, которые на этом можно получить. Педагогического смысла в этом тоже немного. А кто хочет экономить память до предела, тот может вообще выкинуть этот модуль из сборки.
Во-вторых, сам факт наличия модуля мета очень полезен и, возможно, позволит решить вопрос с печатью.
В-третьих, я так и не посмотрел видео от начала и до конца (всё время дёргали меня), но я понял, что вопрос о семантике достоин долгих ночных ворочаний и утренних озарений. Я вспомнил, что у Firebird есть аж три близких диалекта (для консоли, для триггеров и для встроенного SQL), и что в Яре я хотел различать «скрипты» и «модули». И что мои недавние раздумия про tcl приводят к мысли о том, что язык для процедур и язык для командной строки - это, скорее всего, должны быть два разных языка. По той простой причине, что код в модуле один раз пишется и много раз читается. А код в консоли зачастую пишется один раз и читается не более одного раза. Т.е. цель другая и оптимальное решение другое.
Евгений осмелился сделать для интерпретатора семантику, отличную от семантики компонентного Паскаля - этот факт требует большого осмысления.
SovietPony писал(а):
Генерировать модули и потом их компилировать - это адовый костыль, чтобы побыстрей.
Лучше, а может даже и проще, написать человеческий интерпретатор с нормальным языком для интерактвного ввода. Это не так уж и сложно (да хотя бы тот же лишп).
Это решение лишено интегральности. Лисп не так прост, как видится издалека. Большинство промышленных лиспов содержат компилятор в машинный код. Я могу в командной строке определить функцию и эта функция будет точно такой же по всем своим свойствам, как функция в скомпилированном модуле. Допустим, мы идём по пути который вы предлагаете и пишем в консоли:
Цитата:
PROCEDURE Ъ : INTEGER;
RETURN 2;
END Ъ
Это будет интерпретируемая процедура (мы же написали интерпретатор, а не компилятор). Она не будет интегрирована (указатель на неё мы с трудом сможем или вообще не сможем записать в поле, ожидающее указатель на процедуру с такой же сигнатурой). Итог: мы потратили больше труда, и повторили в плохом качестве то, что в BlackBoxComponentBuilder уже есть в хорошем, притом оказались оторваны от среды. Поэтому подход с генерацией модулей - не костыль, а единственно правильный подход, если мы хотим семантику REPL приближенную к семантике КП. Другое дело, можно поменять компилятор так, чтобы ему не нужно было выписывать все эти слова MODULE и т.п.
В-четвёртых, похоже, что Евгений проделал массу необходимой работы. Может быть, его интерпретатор может быть пригоден и можно сосредоточиться на собственно реализации консоли.