Как-то так:
- некешированная версия
- кешированная версия
Слово @Cache выглядит примерно вот так:
STRING FUNCTION A IN %S Result := 'XXX' ; // A
- некешированная версия
STRING FUNCTION A IN %S @Cache ( IN aCaller aCaller -> %S |U ) Result := 'XXX' ; // A
- кешированная версия
Слово @Cache выглядит примерно вот так:
INLINE CALLER operator @Cache ^ IN aKey STRING VAR l_Key l_Key := ( [ Caller aKey |^@ DO ] strings:Cat ) // - получаем ключ кеша l_Key := ( l_Key Caller |N Cat ) // - дополняем ключ именем метода OBJECT VAR l_ValueVar VALUES_CACHE l_Key FindMember >>> l_ValueVar // - ищем сохранённое значение if ( l_ValueVar pop:object:IsNil ) then // - значение не найдено begin Caller Code+1 DO // - вычисляем значение, т.е. вычисляем начиная с инструкции "за нами" VAR l_Value >>> l_Value // - снимаем значение со стека в l_Value VALUES_CACHE ->^ l_Key ^:= l_Value // - записываем значение в кеш l_Value // - кладём значение на стек end else begin l_ValueVar DO // - кладём ранее вычисленное значение на стек end EXIT // - это - ВАЖНО. Так мы выходим из Caller, т.к. мы - INLINE ; // @Cache
Комментариев нет:
Отправить комментарий