предлагаю забрать у меня
StdInterpreter из этого коммита. надо чуть-чуть косметики (убрать UP, ещё мелочи), чтобы вернуть его в компонентный паскаль, и будет полностью совместимый со старым, плюс дополнительные радости:
* скипанье лишних точек с запятыми;
* поддержка синтаксиса типа `StdLog.String("boo"):Ln` (т.е. двоеточие обозначает "использовать модуль из прошлого вызова);
* поддержка математических выражений (int, longint, real, сложение строк, понимает функции типа `sin()`, `cos()`, и ты пы.);
* автоматическое преобразование типов, если возможно (int -> short, etc.), что позволяет вызывать более широкий диапазон экспортированых процедур. в частности, реалы, булы, строки, короткие строки, короткие инты, длинные инты, etc.
круто, удобно, герметично, коммандеры станут ещё более вкусными.
также после этого предлагаю поправить код коммандеров, чтобы он понимал закавычивание одинарными, двойными и обратными кавычками. тоже удобно.
чтобы было понятно, что может новый интерпретатор: вот это вот всё может (плюс у меня коммандеры понимают разное закавычивание).
Код:
^Q";;LamentdevLog.String('boo!'):Ln;;"
^Q ';;LamentdevLog.String("foo!"); LamentdevLog.Ln;;'
^Q `;;LamentdevLog.String("goo!"):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(660):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Real(666):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Real("666"):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Char(33):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Char(21X):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Char('@'):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Char("@"):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(0000000000000000000000000660):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(0):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(0000):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(660 + 6 * 2 DIV 2):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(660 + 12 - 6 * 4 DIV 2 DIV 2):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int(660 * (3 - 2) + 6):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Real(666 / 10):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int((-1) MOD 100H):Ln;;`
^Q `;;LamentdevLog.String("goo!"):Int((-10) DIV 3):Ln;;`
^Q `LamentdevLog.Int(ABS(1)):Ln`
^Q `LamentdevLog.Real(SIN(1)):Ln`
^Q `LamentdevLog.Real(PI):Ln`
^Q `LamentdevLog.Real(PI+100):Ln`
^Q `LamentdevLog.Real(SIN(PI)):Ln`
^Q `LamentdevLog.Real(COS(PI)):Ln`
^Q `LamentdevLog.Real(POW(2, 16)):Ln`
^Q `LamentdevLog.Real(ARCTAN2(2, 16)):Ln`
^Q `LamentdevLog.Real(ArcTan2(2, 16)):Ln`
^Q `LamentdevLog.Real(ABS(COS(PI)) + PI):Ln`
^Q `LamentdevLog.Bool(TRUE):Ln`
^Q `LamentdevLog.Bool(FALSE):Ln`
^Q `LamentdevLog.String("'" + 21X + '"'):Ln`
^Q `LamentdevLog.Int(ORD('A')):Ln`
^Q `LamentdevLog.String(CHR(ORD('A'))):Ln`
документацию я пока не дополнил, правда.