Предыдущая серия была тут - http://18delphi.blogspot.com/2013/11/gui-2.html
Теперь хочется рассказать вот о чём.
Как устроена работа с переменными, оператор равно и что такое WordWorker'ы.
Рассмотрим пример:
Что тут написано?
VAR I - определяет переменную с именем I в текущем контексте видимости (о контекстах позже поговорим отдельно).
1 - кладёт на стек значений целое число 1.
=: I - выбирает значение со стека и кладёт его в переменную I.
Как всё это устроено?
Сейчас попробую рассказать.
До сих пор нам встречались слова-наследники от TscriptKeyWord, которые умели выбирать значения из стека значений (TscriptContext) и работать с ними. Также они умели класть значения на стек. Пример тут - http://18delphi.blogspot.ru/2013/11/gui.html
Теперь хочется затронуть слова, которые не только умеют работать со значениями со стека ("параметры слева"), но и со словами, которые следуют в коде за ними ("параметры справа").
Одним из таких слов и является оператор равно - =:
Семантически он похож на оператор равно Паскаля, только "перевёрнут в другую сторону". Это "наследие" обратной польской записи, но это, поверьте мне, не так уж и важно.
Слова, которые умеют работать с "параметрами справа" я исторически называю WordWorker'ами.
И соответственно - наследуются они от класса TscriptWordWorker.
Разберём устройство этого класса:
Пока в дальнейшие детали этого слова вдаваться не будем.
Также есть ещё наследник от него TscriptVarWorker - слово, которое обрабатывает переменную.
Выглядит оно вот так:
И тогда мы можем написать:
Пока - всё.
Дальнейшие детали опишу в следующих сериях.
Теперь хочется рассказать вот о чём.
Как устроена работа с переменными, оператор равно и что такое WordWorker'ы.
Рассмотрим пример:
VAR I 1 =: I
Что тут написано?
VAR I - определяет переменную с именем I в текущем контексте видимости (о контекстах позже поговорим отдельно).
1 - кладёт на стек значений целое число 1.
=: I - выбирает значение со стека и кладёт его в переменную I.
Как всё это устроено?
Сейчас попробую рассказать.
До сих пор нам встречались слова-наследники от TscriptKeyWord, которые умели выбирать значения из стека значений (TscriptContext) и работать с ними. Также они умели класть значения на стек. Пример тут - http://18delphi.blogspot.ru/2013/11/gui.html
Теперь хочется затронуть слова, которые не только умеют работать со значениями со стека ("параметры слева"), но и со словами, которые следуют в коде за ними ("параметры справа").
Одним из таких слов и является оператор равно - =:
Семантически он похож на оператор равно Паскаля, только "перевёрнут в другую сторону". Это "наследие" обратной польской записи, но это, поверьте мне, не так уж и важно.
Слова, которые умеют работать с "параметрами справа" я исторически называю WordWorker'ами.
И соответственно - наследуются они от класса TscriptWordWorker.
Разберём устройство этого класса:
interface
type
TscriptWordWorker = class(TscriptKeyWord)
protected
procedure WorkTheWord(aWordToTheRight : TscriptKeyWord; aContext: TscriptContext); virtual; abstract;
end;//TscriptWordWorker
Пока в дальнейшие детали этого слова вдаваться не будем.
Также есть ещё наследник от него TscriptVarWorker - слово, которое обрабатывает переменную.
Выглядит оно вот так:
interface
type
IscriptVar = interface
['{39369047-E783-4A4B-9657-6C2450D737C3}']
procedure PopFrom(aContext: TscriptContext);
...
end;//IscriptVar
TscriptVarWorker = class(TscriptWordWorker)
protected
procedure WorkTheWord(aWordToTheRight : TscriptKeyWord; aContext: TscriptContext); override;
procedure WorkTheVar(aVarToTheRight : IscriptVar; aContext: TscriptContext); virtual; abstract;
end;//TscriptVarWorker
implementation
procedure TscriptVarWorker.WorkTheWord(aWordToTheRight : TscriptKeyWord; aContext: TscriptContext)
var
l_Var : IscriptVar;
begin
if Supports(aWordToTheRight, l_Var) then
WorkTheVar(l_Var, aContext)
else
Assert(false);
end;
И тогда мы можем написать:
interface
type
TkwPopToVar = class(TscriptVarWorker)
protected
procedure WorkTheVar(aVarToTheRight : IscriptVar; aContext: TscriptContext); override;
end;//TkwPopToVar
implementation
procedure TkwPopToVar.WorkTheVar(aVarToTheRight : IscriptVar; aContext: TscriptContext);
begin
aVarToTheRight.PopFrom(aContext);
end;
initialization
ScriptEngine.RegisterKeyWord(TkwPopToVar, '=:');
Пока - всё.
Дальнейшие детали опишу в следующих сериях.
Комментариев нет:
Отправить комментарий