среда, 1 июля 2015 г.

ToDo. Сделать кеширование результатов слов

Как-то так:

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

Комментариев нет:

Отправить комментарий