UNIT ElementsRTTI.ms.dict USES types.ms.dict axiom_push.ms.dict core.ms.dict NoStrangeSymbols.ms.dict WordsRTTI.ms.dict ; USES CompileTimeVar.ms.dict ; ARRAY CompileTime-VAR [empty] [] %REMARK 'Пустой итератор' STRING ENGINE_WORD TYPE ModelElement %REMARK 'Элемент модели' ENGINE_WORD TYPE STEREOTYPE %REMARK 'Стереотип элемента модели' CONST kind_NormalClass 0 CONST kind_ParameterizedClass 1 CONST opkind_Normal 0 CONST opkind_Implemented 1 CONST opkind_Overridden 2 CONST class_Class 0 CONST class_Category 1 CONST class_Attribute 2 CONST class_Operation 3 CONST class_Dependency 4 CONST class_Parameter 5 CONST UnknownAccess -1 CONST PrivateAccess 0 CONST ProtectedAccess 1 CONST PublicAccess 2 CONST ImplementationAccess 3 CONST lt_unknown -1 CONST lt_agr 0 CONST lt_lnk 1 CONST lt_ref 1 CONST at_unknown -1 CONST at_regular 0 CONST at_virtual 0 CONST at_abstract 1 CONST at_final 2 CONST at_override 3 BOOLEAN FUNCTION .IsWord IN aValue ( aValue IsObj ) AND ( aValue IS class::TtfwWord ) >>> Result ; // .IsWord BOOLEAN FUNCTION .IsSequence IN aValue ( aValue .IsWord ) AND ( aValue IS class::TkwBeginLikeCompiledCode ) >>> Result ; // .IsSequence USES ref.ms.dict ; EXPORTS ref.ms.dict MACRO elem_func Literal IN aName %SUMMARY 'Функция на элементе модели' ; aName |N this.method.addr nil 'ModelElement' do_word_func ; // elem_func MACRO elem_func_v Literal IN aStereoName Literal IN aName %SUMMARY 'Виртуальная функция на элементе модели' ; %TODO 'Вообще говоря это потом надо скрестить с elem_func анализируя VIRTUAL, ABSTRACT и OVERRIDE' aName |N this.method.addr nil 'ModelElement' do_word_func ; // elem_func_v PROCEDURE do_elem_proc STRING IN aName ENGINE_WORD IN aSelf ENGINE_WORD IN aModifier %SUMMARY 'Реализация elem_proc и elem_generator' ; Ctx:ClearTypeInfo axiom:PushSymbol VOID aName aSelf aModifier 'ModelElement' do_word_func ; // do_elem_proc MACRO elem_proc Literal IN aName %SUMMARY 'Процедура на элементе модели' ; aName |N this.method.addr nil do_elem_proc ; // elem_proc MACRO elem_generator Literal IN aName %SUMMARY 'Генератор содержимого элемента' ; aName |N this.method.addr nil do_elem_proc ; // elem_generator MACRO elem_ref_proc Literal IN aName %SUMMARY 'Процедура на элементе модели, который передаётся по ссылке' ; aName |N this.method.addr Addr LVALUE_MOD do_elem_proc ; // elem_ref_proc MACRO elem_iterator [ 'ARRAY elem_func' ] Ctx:Parser:PushArray @SELF Ctx:SetWordProducerForCompiledClass ; // elem_iterator ARRAY FUNCTION .SequenceCode.It TkwBeginLikeCompiledCode IN aCode %SUMMARY 'Преобразует список компилированных слов в итератор вызывающий каждое из этих слов' ; aCode CodeIterator .map> DO >>> Result ; // .SequenceCode.It ARRAY FUNCTION Seq: ^ IN aCode %SUMMARY 'Преобразует список компилированных слов в итератор вызывающий каждое из этих слов' ; aCode CodeIterator .map> DO >>> Result ; // Seq: : 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 aLambda DO end // aCacheWhere IsString else begin 'cache:' aKey Cat >>> aKey VAR l_FieldVar aCacheWhere %% aKey >>> l_FieldVar if ( l_FieldVar NotValid ) then begin VAR l_NewVar aKey false aCacheWhere pop:NewWordDefinitor:CheckVar >>> l_NewVar @SELF l_NewVar pop:Word:SetProducer TRY aLambda DO EXCEPT [ 'Ошибка вызова: ' aKey ' на ' aCacheWhere pop:Word:Name ] strings:Cat . aDefault END l_NewVar pop:Word:SetValue l_NewVar DO end else begin l_FieldVar DO end end // aCacheWhere IsNil ; // DoCache : CacheWord ModelElement IN aCacheWhere TtfwWord IN aWord ^ IN aLambda aCacheWhere aWord pop:Word:Name 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 ANY elem_func ElemMember STRING IN aMemberName IN aDefaultValue if ( Self IsNil ) then begin aDefaultValue >>> Result end // Self IsNil else if ( Self IsString ) then begin aDefaultValue >>> Result end // Self IsString else begin TtfwWord VAR l_FieldVar Self %% aMemberName >>> l_FieldVar if ( l_FieldVar NotValid ) then begin Self %% 'Original' >>> l_FieldVar if ( l_FieldVar NotValid ) then begin aDefaultValue >>> Result end // l_FieldVar NotValid else begin TtfwWord VAR l_Original l_FieldVar DO >>> l_Original if ( l_Original IsNil ) then begin aDefaultValue >>> Result end // l_Original IsNil else begin l_Original aMemberName aDefaultValue call.me >>> Result end // l_Original IsNil end // l_FieldVar NotValid end // l_FieldVar NotValid else begin l_FieldVar DO >>> Result end // l_FieldVar NotValid end // Self IsString ; // ElemMember elem_iterator ElemList STRING IN aMemberName Self aMemberName [empty] DoCache ( Self aMemberName [empty] .ElemMember ) >>> Result ; // ElemList STRING elem_func ElemString STRING IN aMemberName Self aMemberName '' DoCache ( Self aMemberName '' .ElemMember ) >>> Result ; // ElemString TtfwWord elem_func ElemWord STRING IN aMemberName Self aMemberName nil DoCache ( Self aMemberName nil .ElemMember ) >>> Result ; // ElemWord elem_iterator Children Self 'Children' .ElemList >>> Result ; // Children elem_iterator Constants Self 'Constants' .ElemList >>> Result ; // Constants elem_iterator Dependencies Self 'Dependencies' .ElemList >>> Result ; // Dependencies elem_iterator Injected Self 'Injected' .ElemList >>> Result ; // Injected elem_iterator Forwarded Self 'Forwarded' .ElemList >>> Result ; // Forwarded elem_iterator Attributes Self 'Attributes' .ElemList >>> Result ; // Attributes elem_iterator Parameters Self 'Parameters' .ElemList >>> Result ; // Parameters elem_iterator Operations Self 'Operations' .ElemList >>> Result ; // Operations elem_iterator Overridden Self 'Overridden' .ElemList >>> Result ; // Overridden elem_iterator Implemented Self 'Implemented' .ElemList >>> Result ; // Implemented elem_iterator Inherits Self 'Inherits' .ElemList >>> Result ; // Inherits elem_iterator Implements Self 'Implements' .ElemList >>> Result ; // Implements STRING elem_func Name if ( Self IsString ) then begin Self >>> Result end // Self IsString else begin Self 'Name' .ElemString >>> Result end // Self IsString ; // Name STRING elem_func Documentation Self '%SUM' .ElemString >>> Result ; // Documentation TtfwWord elem_func Target Self 'Target' .ElemWord >>> Result ; // Target TtfwWord elem_func ValueType Self 'ValueType' .ElemWord >>> Result ; // ValueType ANY elem_func GetUP Literal IN aName Self aName |N '' .ElemMember >>> Result ; // GetUP BOOLEAN elem_func UPisTrue Literal IN aName Self aName |N false .ElemMember true ?== >>> Result ; // UPisTrue TtfwWord STRING elem_func Stereotype Self 'Stereotype' .ElemWord >>> Result ; // Stereotype BOOLEAN elem_func IsStereotype ^ IN aStereo BOOLEAN FUNCTION IsStereoKindOf TtfwWord IN anOurStereo TtfwWord IN anOtherStereo anOurStereo 'isA:' anOtherStereo pop:Word:Name Cat false DoCache ( BOOLEAN VAR l_Is anOurStereo anOtherStereo == >>> l_Is if ( l_Is ! ) then begin anOurStereo .Name anOtherStereo .Name == >>> l_Is end // l_Is ! if ( l_Is ! ) then begin anOurStereo .Inherited.Words .trunc> ( DROP l_Is ! ) .for> ( TtfwWord IN anAncestor if ( anAncestor anOtherStereo call.me ) then begin true >>> l_Is end ) end // l_Is ! l_Is ) >>> Result ; // IsStereoKindOf TtfwWord VAR l_OurStereo Self .Stereotype >>> l_OurStereo if ( l_OurStereo IsNil ) then begin false >>> Result end // l_OurStereo IsNil else begin TtfwWord VAR l_Stereo aStereo DO >>> l_Stereo l_OurStereo l_Stereo IsStereoKindOf >>> Result end // // l_OurStereo IsNil ; // IsStereotype INTEGER elem_func Visibility Self 'Visibility' UnknownAccess .ElemMember >>> Result ; // Visibility INTEGER elem_func Abstraction Self 'Abstraction' at_unknown .ElemMember >>> Result ; // Abstraction STRING elem_func GUID Self 'GUID' '' .ElemMember >>> Result ; // GUID INTEGER elem_func OpKind Self 'OpKind' opkind_Normal .ElemMember >>> Result ; // OpKind ModelElement elem_func Parent Self 'Parent' .ElemWord >>> Result ; // Parent USES LoadOnDemand.ms.dict ; EXPORTS LoadOnDemand.ms.dict USES MDProcess_CoreTemplates.tpi.script ; EXPORTS MDProcess_CoreTemplates.tpi.script USES MDProcess_Templates.tpi.script ; EXPORTS MDProcess_Templates.tpi.script USES MDProcess_ForDelphi.tpi.script ; EXPORTS MDProcess_ForDelphi.tpi.script USES MDProcess_ForF1.tpi.script ; EXPORTS MDProcess_ForF1.tpi.script : st_in CONST Name 'in' @SELF ; // st_in : st_inout CONST Name 'inout' @SELF ; // st_inout : st_out CONST Name 'out' @SELF ; // st_out : st_const CONST Name 'const' @SELF ; // st_const : st_noconst CONST Name 'noconst' @SELF ; // st_noconst : st_NodeType_ CONST Name 'NodeType_' @SELF ; // st_NodeType_ //: st_VCMAbstractFormSetFactory // CONST Name 'VCMAbstractFormSetFactory' // @SELF //; // st_VCMAbstractFormSetFactory
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
пятница, 18 декабря 2015 г.
#1161. Кеширование результатов вычислений. Только код
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий