: DoCache
ModelElement IN aCacheWhere
STRING IN aKey
IN aDefault
^ IN aLambda
if ( aCacheWhere IsNil ) then
begin
aLambda DO
end // aCacheWhere IsNil
else
if ( aCacheWhere IsString ) then
begin
//ERROR [ aCacheWhere ':' aKey ]
//[ aCacheWhere ':' aKey ] strings:Cat Msg
aLambda DO
end // aCacheWhere IsString
else
/*(*
if ( aCacheWhere IsIntf ) then
begin
aLambda DO
end // aCacheWhere IsIntf
else
*)*/
begin
ModelElement VAR l_CacheWhere
VAR l_IsIntf
false >>> l_IsIntf
if ( aCacheWhere IsIntf ) then
begin
aCacheWhere pop:WordBox:Boxed >>> l_CacheWhere
true >>> l_IsIntf
end // ( aCacheWhere IsIntf )
else
begin
aCacheWhere >>> l_CacheWhere
end
'cache:' aKey Cat >>> aKey
VAR l_FieldVar
l_CacheWhere %% aKey >>> l_FieldVar
if ( l_FieldVar NotValid ) then
begin
TRY
aLambda DO
EXCEPT
[ 'Ошибка вызова: ' current:exception:Message ' : ' aKey ' на ' l_CacheWhere .WordName ] strings:Cat .
aDefault
END
if l_IsIntf then
begin
if ( DUP IsIntf ! ) then
begin
false >>> l_IsIntf
end // l_IsIntf
end // l_IsIntf
if ( l_IsIntf ! ) then
begin
VAR l_NewVar
aKey false l_CacheWhere pop:NewWordDefinitor:CheckVar >>> l_NewVar
@SELF l_NewVar pop:Word:SetProducer
l_NewVar pop:Word:SetValue
l_NewVar DO
end // ( l_IsIntf ! )
end // ( l_FieldVar NotValid )
else
begin
l_FieldVar DO
end
end // aCacheWhere IsNil
; // DoCache
: CacheWord
ModelElement IN aCacheWhere
TtfwWord IN aWord
^ IN aLambda
aCacheWhere aWord .WordName nil DoCache ( aLambda DO )
; // CacheWord
MACRO Cache
axiom:PushSymbol @SELF
axiom:PushSymbol CacheWord
; // Cache
MACRO CacheMethod
'Self' Ctx:Parser:PushSymbol
axiom:PushSymbol @SELF
axiom:PushSymbol CacheWord
; // CacheMethod
WordAlias Cached: CacheMethod
STRING elem_func UIDEx
Cached:
(
VAR l_UID
Self .UID >>> l_UID
RULES
( l_UID IsNil )
(
VAR l_Name
Self .Name >>> l_Name
RULES
( l_Name IsNil )
( Self .WordName )
DEFAULT
( l_Name '_' Self .WordName Cat )
; // RULES
)
DEFAULT
l_UID
; // RULES
)
>>> Result
; // UIDEx
STRING FUNCTION ValueToKey
ANY IN aValue
RULES
( aValue IsNil )
''
( aValue IsString )
aValue
( aValue IsArray )
(
aValue
.map> call.me
strings:Cat
)
( aValue IsBool )
( aValue ToPrintable )
( aValue IsInt )
( aValue ToPrintable )
( aValue IsIntf )
ERROR 'Невозможно построить ключ для интерфейса'
( aValue Is class::TkwCompiledWord )
( aValue .UIDEx )
( aValue Is class::TtfwWord )
( aValue .WordName )
( aValue IsObj )
ERROR 'Невозможно построить ключ для абстрактного объекта'
( aValue IsNil )
''
DEFAULT
( aValue ToPrintable )
; // RULES
>>> Result
; // ValueToKey
: CacheWordEx
ANY IN aKey
ModelElement IN aCacheWhere
TtfwWord IN aWord
^ IN aLambda
aCacheWhere
aKey ValueToKey aWord .WordName Cat
nil DoCache ( aLambda DO )
; // CacheWordEx
MACRO :Cached:
'Self' Ctx:Parser:PushSymbol
axiom:PushSymbol @SELF
axiom:PushSymbol CacheWordEx
; // :Cached:
WordAlias Cached: CacheMethod
WordAlias GenCached: CacheMethod
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
пятница, 15 апреля 2016 г.
#1227. Скрипты. Реализация кеширования результатов вычисления
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий