О кешировании. Поговорим про добавление вложенных элементов.
Предыдущая серия была тут - http://programmingmindstream.blogspot.ru/2015/12/1148.html.
Там мы поговорили про внутреннее устройство слов словарей.
А также обсудили возможность получения внутренних элементов слов по их имени.
И там у нас возник вопрос:
Теперь возникает закономерный вопрос - "а если мы можем получать внутренние элементы слов, то можем ли мы добавлять новые элементы?"
Ответ - "да можем".
Как?
Сейчас мы это рассмотрим.
Мы уже рассмотрели слова %% и ::. Теперь рассмотрим слово ->.
Вот его определение:
Тут даже два слова определено - ->^ и ->.
Слово ->^ - мы рассмотрим позднее.
А пока приведём пример использования слова ->:
Что тут делается?
Тут сначала объявляется слово A.
Потом ему добавляется переменная X. И ей присваивается целочисленное значение "2".
Потом получается ссылка на переменную X слова A. И затем печатается его значение.
Что мы имеем?
Мы имеем тот факт, что в наших скриптах присутствует рефлексия.
Т.е. мы из скриптов умеем управлять кодом самих же скриптов.
Кроме возможности добавления переменных словам скриптов мы имеем ещё другие возможности получения и побавления мета-информации о словах.
Это мы рассмотрим в следующей статье.
Предыдущая серия была тут - http://programmingmindstream.blogspot.ru/2015/12/1148.html.
Там мы поговорили про внутреннее устройство слов словарей.
А также обсудили возможность получения внутренних элементов слов по их имени.
И там у нас возник вопрос:
Теперь возникает закономерный вопрос - "а если мы можем получать внутренние элементы слов, то можем ли мы добавлять новые элементы?"
Ответ - "да можем".
Как?
Сейчас мы это рассмотрим.
Мы уже рассмотрели слова %% и ::. Теперь рассмотрим слово ->.
Вот его определение:
OBJECT operator ->^
^@ IN aSelf
^ IN aName
STRING VAR l_Name
aName DO >>> l_Name
OBJECT VAR l_Self
aSelf |^@ >>> l_Self
if ( l_Self pop:object:IsNil ) then
begin
nil >>> Result
end
else
begin
VAR l_NewVar
l_Name l_Self pop:NewWordDefinitor:CheckWord pop:KeyWord:Word >>> l_NewVar
if ( l_NewVar pop:object:IsNil ) then
(
l_Name false l_Self pop:NewWordDefinitor:CheckVar
>>> l_NewVar
Ctx:ClearTypeInfo
@ VAR l_NewVar pop:Word:SetProducer
)
l_NewVar >>> Result
end // l_Self pop:object:IsNil
; // ->^
^@ operator ->
^@ IN aSelf
^L IN aName
aSelf ->^ ( aName |N ) >>> Result
; // ->
Тут даже два слова определено - ->^ и ->.
Слово ->^ - мы рассмотрим позднее.
А пока приведём пример использования слова ->:
: A ; // A A -> X := 2 // Добавляем слову A переменную X и присваиваем ей целочисленное значение "2". X -> X Print // Печатаем значение переменной X слова A.
Что тут делается?
Тут сначала объявляется слово A.
Потом ему добавляется переменная X. И ей присваивается целочисленное значение "2".
Потом получается ссылка на переменную X слова A. И затем печатается его значение.
Что мы имеем?
Мы имеем тот факт, что в наших скриптах присутствует рефлексия.
Т.е. мы из скриптов умеем управлять кодом самих же скриптов.
Кроме возможности добавления переменных словам скриптов мы имеем ещё другие возможности получения и побавления мета-информации о словах.
Это мы рассмотрим в следующей статье.
Комментариев нет:
Отправить комментарий