Коммит:
https://bitbucket.org/lulinalex/mindstream/commits/7182b640d68cdf088d7c62573ce1b9e0cda6c309
https://bitbucket.org/lulinalex/mindstream/commits/7182b640d68cdf088d7c62573ce1b9e0cda6c309
// Аксиоматика IMMEDIATE OPERATOR VOID TtfwWordModifier::tfw_wmVoid Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR ^@ TtfwWordModifier::tfw_wmLeftWordRef Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR ^ TtfwWordModifier::tfw_wmRightWordRef Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR AGGREGATION TtfwWordModifier::tfw_wmAggregation Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR LINK TtfwWordModifier::tfw_wmLink Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR REFERENCE TtfwWordModifier::tfw_wmReference Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR INLINE TtfwWordModifier::tfw_wmInline Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR SUMMONED TtfwWordModifier::tfw_wmSummoned Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR ABSTRACT TtfwWordModifier::tfw_wmAbstract Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR VIRTUAL TtfwWordModifier::tfw_wmAbstract Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR FINAL TtfwWordModifier::tfw_wmFinal Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR SEALED TtfwWordModifier::tfw_wmSealed Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR OVERRIDE TtfwWordModifier::tfw_wmOverride Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR REDEFINITION TtfwWordModifier::tfw_wmRedefinition Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR REDEFINEABLE TtfwWordModifier::tfw_wmRedefineable Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR REALIZE TtfwWordModifier::tfw_wmRealize Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR PRIVATE TtfwWordModifier::tfw_wmPrivate Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR PROTECTED TtfwWordModifier::tfw_wmProtected Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR PUBLIC TtfwWordModifier::tfw_wmPublic Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR W-STRING TtfwWordModifier::tfw_wmWStr Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR FILE TtfwWordModifier::tfw_wmFile Ctx:IncludeModifier ; VOID IMMEDIATE OPERATOR OBJECT TtfwWordModifier::tfw_wmObj Ctx:IncludeModifier ; // OBJECT VOID IMMEDIATE OPERATOR ^L // - определяет ПРАВЫЙ параметр, который может быть как словом, так и неизвестным идентификатором // L - сокращение типа от слова Literal // При этом передаётся ссылка на ИСХОДНОЕ слово, а не на КОМПИЛИРОВАННУЮ последовательность. // Это важно для ОПЕРАТОРОВ и WordWorker'ов. TtfwWordModifier::tfw_wmRightWordRef Ctx:IncludeModifier TtfwWordModifier::tfw_wmTreatUnknownAsString Ctx:IncludeModifier ; // ^L OPERATOR __DefineParam // - тут стереотип на стеке // - тут имя на стеке Ctx:NewWordDefinitor pop:NewWordDefinitor:DefineInParameter // - тут параметр на стеке Ctx:PushCompiler pop:Compiler:CompileInParameterPopCode Ctx:ClearTypeInfo ; // __DefineParam IMMEDIATE VOID OPERATOR __DefineNameParam @SELF 'aName' __DefineParam ; // __DefineNameParam IMMEDIATE VOID OPERATOR IN ^L __DefineNameParam @SELF aName DO __DefineParam ; // IN FUNCTION ->0 // - возвращает первый параметр указанного слова OBJECT IN %S 0 %S pop:Word:GetParam DO >>> Result ; // ->0 VOID IMMEDIATE OPERATOR BOOLEAN TtfwWordModifier::tfw_wmBool Ctx:IncludeModifier ; // BOOLEAN VOID IMMEDIATE OPERATOR CALLER TtfwWordModifier::tfw_wmCaller Ctx:IncludeModifier ; // BOOLEAN VOID IMMEDIATE OPERATOR CARDINAL TtfwWordModifier::tfw_wmInt Ctx:IncludeModifier ; // CARDINAL VOID IMMEDIATE OPERATOR INTEGER TtfwWordModifier::tfw_wmInt Ctx:IncludeModifier ; // INTEGER VOID IMMEDIATE OPERATOR STRING TtfwWordModifier::tfw_wmStr Ctx:IncludeModifier ; // STRING VOID IMMEDIATE OPERATOR ARRAY TtfwWordModifier::tfw_wmList Ctx:IncludeModifier ; // ARRAY VOID IMMEDIATE OPERATOR INTERFACE TtfwWordModifier::tfw_wmIntf Ctx:IncludeModifier ; // INTERFACE VOID IMMEDIATE OPERATOR CHAR TtfwWordModifier::tfw_wmChar Ctx:IncludeModifier ; // CHAR VOID IMMEDIATE OPERATOR CLASS TtfwWordModifier::tfw_wmClass Ctx:IncludeModifier ; // CLASS INLINE OPERATOR then ^ IN aWhatToThen aWhatToThen DO ; // then BOOLEAN FUNCTION NotValid IN %S if ( %S IsVoid ) then ( true >>> Result ) else if ( %S pop:object:IsNil ) then ( true >>> Result ) else ( false >>> Result ) ; // NotValid BOOLEAN OPERATOR IS CLASS OBJECT IN anObj ^ IN aClass if ( anObj IsClass ) then ( ( aClass DO anObj pop:class:Inherits ) >>> Result ) else ( ( aClass DO anObj pop:object:Inherits ) >>> Result ) ; // IS STRING FUNCTION |N /*OBJECT*/ IN %S if ( %S IsVoid ) then ( '' >>> Result ) else if ( %S pop:object:IsNil ) then ( '' >>> Result ) else if ( class::TkwString %S pop:object:Inherits ) then ( %S DO >>> Result ) else if ( class::TkwInteger %S pop:object:Inherits ) then ( %S DO IntToStr >>> Result ) else if ( class::TkwMain %S pop:object:Inherits ) then ( %S pop:object:ClassName >>> Result ) else if ( class::TkwCompiledMain %S pop:object:Inherits ) then ( %S pop:object:ClassName >>> Result ) else ( %S pop:Word:Name >>> Result ) ; // |N STRING OPERATOR (+) STRING IN aLeft ^ IN aRight aLeft aRight DO Cat >>> Result ; // (+) IMMEDIATE OPERATOR WordAlias ^L IN aName ^ LINK IN aCode aCode aName |N Define ; // WordAlias WordAlias begin BEGIN WordAlias end END WordAlias operator OPERATOR WordAlias __operator OPERATOR WordAlias ITERATE Iterate WordAlias WordWorker WORDWORKER STRING FUNCTION strings:Cat ARRAY IN anArray // - складывает строки массива на стеке '' >>> Result @ ( Result SWAP Cat >>> Result ) anArray Iterate ; // strings:Cat STRING OPERATOR __SourceInfo OBJECT IN aCaller if ( Ctx:Parser IsNil ) then begin aCaller pop:Word:SourcePointString >>> Result end else begin [ Ctx:Parser pop:Parser:FileName ' line: ' Ctx:Parser pop:Parser:SourceLine IntToStr ] strings:Cat >>> Result end ; // __SourceInfo FORWARD VarMsgToStr VOID OPERATOR __ERROR IN aMsg OBJECT IN aCaller if ( Ctx:Parser IsNil ) then begin [ aCaller __SourceInfo ' |=> ' aMsg VarMsgToStr ] strings:Cat class::EtfwRunner CreateAndRaise end else begin [ aCaller __SourceInfo ' |=> ' aMsg VarMsgToStr ] strings:Cat class::EtfwCompiler CreateAndRaise end ; // __ERROR OBJECT OPERATOR |^@ ^@ IN aSelf aSelf pop:Word:GetRef >>> Result ; // |^@ OPERATOR EVAL ^ IN aWhat aWhat |^@ DO ; // EVAL VOID CALLER OPERATOR ASSURE ^ IN aCondition ^ IN aMessage EVAL aCondition ! ? begin aMessage Caller __ERROR end ; // ASSURE VOID CALLER OPERATOR ?ASSURE BOOLEAN IN aCondition ^ IN aMessage aCondition ! ? begin aMessage Caller __ERROR end ; // ?ASSURE VOID CALLER OPERATOR ?FAIL BOOLEAN IN aCondition ^ IN aMessage aCondition ? begin aMessage Caller __ERROR end ; // ?FAIL VOID CALLER OPERATOR ERROR ^ IN aMsg aMsg Caller __ERROR ; // ERROR : __DefineVarEx STRING IN aName OBJECT IN aStereo aName Ctx:NewWordDefinitor pop:NewWordDefinitor:CheckWord pop:KeyWord:Word pop:object:IsNil ?ASSURE [ 'Слово ' aName ' уже существует. Нельзя определить переменную с таким же именем' ] aName true Ctx:NewWordDefinitor pop:NewWordDefinitor:CheckVar DUP aStereo SWAP pop:Word:SetProducer Ctx:ClearTypeInfo ; // __DefineVarEx : __DefineVar __DefineVarEx DROP ; // __DefineVar IMMEDIATE VOID OPERATOR VAR ^L IN aName aName |N @SELF __DefineVar ; // VAR STRING FUNCTION VarMsgToStr OBJECT IN aMessage VAR l_Msg aMessage DO >>> l_Msg if ( l_Msg IsArray ) then ( l_Msg strings:Cat >>> Result ) else ( l_Msg >>> Result ) ; // VarMsgToStr WordAlias var VAR IMMEDIATE VOID operator PROCEDURE @SELF Ctx:SetWordProducerForCompiledClass 'VOID' Ctx:Parser:PushSymbol '__operator' Ctx:Parser:PushSymbol ; // PROCEDURE WordAlias procedure PROCEDURE WordAlias function FUNCTION ^@ OPERATOR @^ // - возвращает ссылку на слово, любое, даже непосредственного исполнения // Не адрес, а именно ССЫЛКУ. // Разница в примере: /* @ A DO @^ A @ A ^:= 1 @^ A := 1 // - записи делают одно и то же */ ^ LINK IN aSelf aSelf >>> Result ; // @^ VOID operator := //operator := // - пока так, иначе конструкция @ XXX -> A := 1024 - не работает, т.к. XXX снимается со стека уже в контексте := И срабатывает КОНТРОЛЬ СТЕКА ^@ IN aLeft ^ IN aRight aRight DO >>>^ aLeft ; VOID operator ^:= IN aLeft ^ IN aRight aRight DO >>>^ aLeft ; VOID operator >>>[] IN aLeft ^ IN aRight aLeft aRight DO Array:Add ; operator IT ARRAY IN A ^ IN aWhatToDo aWhatToDo A ITERATE ; // IT WordAlias ==> IT operator for ^ IN aList ^ IN aWhatToDo aList DO ==> ( aWhatToDo DO ) ; // for WordAlias CONSTANT CONST IMMEDIATE VOID operator Test @SELF Ctx:SetWordProducerForCompiledClass 'VOID' Ctx:Parser:PushSymbol '__operator' Ctx:Parser:PushSymbol ; // Test WordAlias Тест Test WordAlias Если if WordAlias если if WordAlias то then WordAlias иначе else WordAlias выходим EXIT WordAlias Выходим EXIT WordAlias =:^ >>>^ WordAlias =: >>> VOID operator +! INTEGER IN anIncrement ^ IN aWhatToIncrement // Пример: // {code} // VAR l_WinID // 5 >>> l_WinID // 1 +! l_WinID // l_WinID . // {code} aWhatToIncrement DO anIncrement + =:^ aWhatToIncrement ; // +! WordAlias =+ +! VOID operator =- INTEGER IN anInc ^ IN aWhatToDecrement aWhatToDecrement DO anInc - =:^ aWhatToDecrement ; // =- VOID operator += ^@ IN aLeft ^ IN aRight aLeft DO aRight DO + >>>^ aLeft ; VOID operator -= ^@ IN aLeft ^ IN aRight aLeft DO aRight DO - >>>^ aLeft ; VOID operator INC ^ IN aWhatToIncrement aWhatToIncrement DO 1 + =:^ aWhatToIncrement ; // INC WordAlias ++! INC WordAlias Inc INC VOID operator DEC ^ IN aWhatToDecrement aWhatToDecrement DO 1 - =:^ aWhatToDecrement ; // DEC WordAlias --! DEC WordAlias Dec DEC BOOLEAN FUNCTION array:HasString ARRAY IN anArray STRING IN aString Result := false PROCEDURE Поиск STRING IN anItem if ( anItem aString SameStr ) ( Result := true ) ; // Поиск @ Поиск anArray ITERATE ; // array:HasString BOOLEAN FUNCTION array:HasText ARRAY IN anArray STRING IN aString Result := false PROCEDURE Поиск STRING IN anItem if ( anItem aString SameText ) ( Result := true ) ; // Поиск @ Поиск anArray ITERATE ; // array:HasText INTEGER FUNCTION array:StringCount ARRAY IN anArray STRING IN aString Result := 0 PROCEDURE Поиск STRING IN anItem if ( anItem aString SameStr ) ( ++! Result ) ; // Поиск @ Поиск anArray ITERATE ; // array:StringCount PROCEDURE "Сравнить текущее исключение с эталоном" STRING VAR l_ClassName current:exception:ClassName >>> l_ClassName l_ClassName . STRING VAR l_Message STRING VAR l_Message_out current:exception:Message >>> l_Message if ( l_ClassName 'EAssertionFailed' SameText ) ( l_Message '(' string:Split DROP >>> l_Message ) else ( l_ClassName 'EAccessViolation' SameText ? ( l_Message ' at ' string:Split DROP >>> l_Message ) ) l_Message 'Главный файл:' string:Split =: l_Message_out =: l_Message l_Message_out '. ' string:Split =: l_Message_out DROP l_Message l_Message_out Cat . ; // "Сравнить текущее исключение с эталоном" PROCEDURE "Выполнить и если было исключение, то выполнить" IN aProc1 IN aProc2 INTEGER VAR l_StackLevel l_StackLevel := StackLevel TRY TRY aProc1 DO EXCEPT "Сравнить текущее исключение с эталоном" aProc2 DO END FINALLY l_StackLevel ReduceStackLevel END ; // "Выполнить и если было исключение, то выполнить" VOID operator анти-тест ^ IN aWhatToDo VAR l_WasException false =: l_WasException "Выполнить {(@ ( aWhatToDo DO ) )} и если было исключение, то выполнить {(@ ( true =: l_WasException ) )}" l_WasException [ 'Тест ' script:FileName ' почему-то стал проходить' ] strings:Cat ASSERTS ; // анти-тест WordAlias "тест с падением" анти-тест VOID operator "Выполнить подавив исключение" ^ IN aWhatToDo VAR l_WasException false =: l_WasException "Выполнить {(@ ( aWhatToDo DO ) )} и если было исключение, то выполнить {(@ ( true =: l_WasException ) )}" l_WasException [ 'Запланированного исключения в тесте: ' script:FileName ' почему-то не случилось' ] strings:Cat ASSERTS ; // "Выполнить подавив исключение" PROCEDURE "Выполнить обработав исключение" OBJECT IN aProc STRING IN anException TRY aProc DO EXCEPT current:exception:Message anException ?!= ? RAISE END ; // "Выполнить обработав исключение" PROCEDURE ToDo STRING IN aString 'To Do: ' aString Cat . ; // ToDo PROCEDURE "! Тест в разработке" script:FileName sysutils:ExtractFileName ' в состоянии разработки' Cat ToDo ; // "! Тест в разработке" PROCEDURE OnTest // - ждёт обновления контролов по OnTest 3 LOOP ( ProcessMessages application:ActionIdle ) // - позволяем пройти всем OnTest ; // OnTest WordAlias "Дать системе перерисоваться" OnTest PROCEDURE "Нажать" STRING IN aString aString key OnTest ; // "Нажать" VOID operator "Обработать Enter модально" ^ IN aWhatToDo @ ( "Нажать {('Enter')}" ) MODAL ( aWhatToDo DO ) ; // "Обработать Enter модально" PROCEDURE ASSUME STRING IN aStr // Включает "условную директиву" aStr в тестируемом приложении // http://mdp.garant.ru/pages/viewpage.action?pageId=236719181 №44 ; // ASSUME PROCEDURE UNASSUME STRING IN aStr // Выключает "условную директиву" aStr в тестируемом приложении // http://mdp.garant.ru/pages/viewpage.action?pageId=236719181 №44 ; // UNASSUME BOOLEAN FUNCTION ArraysAreEqual ARRAY IN A ARRAY IN B A IsArray 'Где массив?' ASSERTS B IsArray 'Где массив?' ASSERTS CONST l_Exception 'Выходим из итератора' INTEGER VAR l_Index l_Index := 0 INTEGER VAR l_Count l_Count := ( A Array:Count ) PROCEDURE DoWithItem IN B[i] if ( l_Index A [i] B[i] ?== ) then ++! l_Index else ( Result := false l_Exception RAISE ) ; if ( l_Count B Array:Count ?!= ) then ( Result := false EXIT ) TRY @ DoWithItem B ITERATE Result := true EXCEPT if ( current:exception:Message l_Exception ?!= ) then RAISE END ; // ArraysAreEqual BOOLEAN operator AND BOOLEAN IN aFirst ^ IN aSecond // Двусторонний, а не обратный польский && if aFirst then ( if ( aSecond DO ) then ( Result := true ) else ( Result := false ) ) else ( Result := false ) ; // AND WordAlias И AND BOOLEAN operator OR BOOLEAN IN aFirst ^ IN aSecond // Двусторонний, а не обратный польский || if aFirst then ( Result := true ) else if ( aSecond DO ) then ( Result := true ) else ( Result := false ) ; // OR WordAlias ИЛИ OR BOOLEAN operator NOT ^ IN aWhatToNot // Правосторонний, а не обратный польский ! Result := ( aWhatToNot DO ! ) ; // NOT WordAlias НЕ NOT BOOLEAN operator = IN aLeft ^ IN aRight // Правосторонний, а не обратный польский == // ТЕПЕРЬ С БЛЭКДЖЕКОМ И МАССИВАМИ! //1 РАВНО 1 . - True //[ 10 20 ] РАВНО ( 10 20 ) . - True //[ 10 20 ] РАВНО ( [ 10 20 ] ) . - True //[ 10 ] РАВНО ( [ 10 ] ) . - True //[ 10 ] РАВНО ( 10 ) . - True //[ 10 ] РАВНО ( 20 ) . - False ARRAY VAR l_Right l_Right := [ aRight DO ] TRY if ( aLeft IsArray ) then ( if ( ( l_Right IsArray ) И ( l_Right Array:Count 1 == ) И ( 0 l_Right [i] IsArray ) ) then ( Result := ( aLeft 0 l_Right [i] ArraysAreEqual ) ) else ( Result := ( aLeft l_Right ArraysAreEqual ) ) ) else ( if ( l_Right Array:Count 1 == ) then ( Result := ( aLeft 0 l_Right [i] ?== ) ) else ( Result := false ) ) FINALLY l_Right := [ ] aLeft := nil END ; // = WordAlias РАВНО = BOOLEAN operator <> IN aLeft ^ IN aRight // Правосторонний, а не обратный польский != Result := ( aLeft = ( aRight DO ) ! ) ; //<> WordAlias НЕРАВНО <> WordAlias "НЕ РАВНО" НЕРАВНО BOOLEAN operator > STRING INTEGER BOOLEAN IN aLeft ^ IN aRight Result := ( aLeft aRight DO GREATER ) ; WordAlias БОЛЬШЕ > BOOLEAN operator < STRING INTEGER BOOLEAN IN aLeft ^ IN aRight Result := ( aLeft aRight DO LESS ) ; WordAlias МЕНЬШЕ < BOOLEAN operator >= STRING INTEGER BOOLEAN IN aLeft ^ IN aRight Result := ( aLeft < ( aRight DO ) ! ) ; WordAlias "БОЛЬШЕ ИЛИ РАВНО" >= BOOLEAN operator <= STRING INTEGER BOOLEAN IN aLeft ^ IN aRight Result := ( aLeft > ( aRight DO ) ! ) ; WordAlias "МЕНЬШЕ ИЛИ РАВНО" <= WordAlias ЯВЛЯЕТСЯ IS WordAlias Is IS BOOLEAN operator NOTIS CLASS OBJECT IN anObj ^ IN aClass Result := NOT ( anObj Is ( aClass DO ) ) ; // NOTIS WordAlias NotIs NOTIS WordAlias НЕЯВЛЯЕТСЯ NOTIS WordAlias "НЕ ЯВЛЯЕТСЯ" НЕЯВЛЯЕТСЯ IMMEDIATE operator WordAliasByRef ^L IN aName ^ IN aCode aCode DO aName |N Define ; // WordAliasByRef IMMEDIATE operator [EXECUTE] ^ IN aCode aCode DO ; // [EXECUTE] STRING operator |NS IN aName Result := ( [ '`' aName |N '`' ] strings:Cat ) ; // |NS OBJECT FUNCTION %ST IN %S if ( %S NotValid ) then ( Result := nil ) else ( Result := ( %S pop:Word:Producer ) ) ; // %ST STRING FUNCTION |S IN %S %S %ST |N =: Result ; // |S operator WHILE ^ IN aCondition ^ IN aWhatToDo @ ( aCondition DO ) WHILEDO ( aWhatToDo DO ) ; // WHILE WordAlias ПОКА WHILE WordAlias while WHILE OBJECT operator %% OBJECT IN aWord ^ IN aName OBJECT VAR l_Member aName DO aWord pop:Word:FindMember >>> l_Member if ( l_Member pop:object:IsNil ) then ( Result := nil ) else ( Result := ( l_Member pop:KeyWord:Word ) ) ; // %% OBJECT FUNCTION %P IN %S VAR l_P l_P := ( %S pop:Word:Parent ) if ( l_P pop:Word:Name '%C' SameText ) then ( l_P := ( l_P pop:Word:Parent ) ) if ( l_P NotValid ) then ( Result := nil ) else ( Result := l_P ) ; // %P ARRAY FUNCTION LIST OBJECT IN anObject ^ IN aFunctor OBJECT VAR l_Element l_Element := anObject Result := [ while true begin l_Element := ( l_Element aFunctor DO ) if ( l_Element pop:object:IsNil ) then BREAK l_Element end ] ; // LIST ^@ operator :: ^@ IN aSelf ^L IN aName OBJECT VAR l_Self aSelf |^@ >>> l_Self STRING VAR l_Name aName |N >>> l_Name OBJECT VAR l_Res l_Self %% l_Name >>> l_Res ASSURE NOT ( l_Res pop:object:IsNil ) [ 'Не найдено поле: ' l_Self LIST %P Reverted ==> ( |N '::' ) l_Self |N '::' l_Name ] l_Res >>> Result ; // :: 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 ; // -> OBJECT FUNCTION %T IN %S VAR l_T l_T := ( %S ->^ '%T' ) if ( l_T NotValid ) then ( Result := nil ) else ( l_T := ( l_T DO ) if ( l_T NotValid ) then ( Result := nil ) else ( Result := l_T ) ) ; // %T STRING FUNCTION %TN IN %S Result := ( %S %T |N ) ; // %TN STRING FUNCTION %TS IN %S Result := ( %S %T |S ) ; // %TS STRING FUNCTION |U IN %S VAR l_U l_U := ( %S ->^ '%U' ) if ( l_U NotValid ) then ( Result := '' ) else ( Result := ( l_U DO |N ) ) ; // |U WordAlias ДА true WordAlias НЕТ false BOOLEAN operator "в интервале" INTEGER IN aValue ^ IN anInterval INTEGER VAR "нижнее значение" INTEGER VAR "верхнее значение" ( anInterval DO ) >>> "верхнее значение" >>> "нижнее значение" Result := ( ( aValue "БОЛЬШЕ ИЛИ РАВНО" "нижнее значение" ) И ( aValue "МЕНЬШЕ ИЛИ РАВНО" "верхнее значение" ) ) ; // "в интервале" ARRAY FUNCTION SplitToArray STRING IN aValue STRING IN aDelim STRING VAR l_Tail aValue >>> l_Tail if ( l_Tail = '' ) then begin Result := [ '' ] end else begin Result := [ while ( l_Tail <> '' ) begin l_Tail aDelim string:Split >>> l_Tail end ] end ; // SplitToArray IMMEDIATE operator __INIT_VAR IN aValue ^ IN aVar aValue >>>^ aVar ; // __INIT_VAR PROCEDURE Ctx:Parser:PushSymbols STRING IN aString aString ' ' SplitToArray ==> ( STRING IN aStr aStr '%#32' ' ' string:Replace >>> aStr if ( '`' aStr StartsStr ) then begin aStr '`' '' string:Replace Ctx:Parser:PushString end else begin aStr Ctx:Parser:PushSymbol end ) ; // Ctx:ParserPushSymbols PROCEDURE Ctx:Parser:PushArray ARRAY IN anArray anArray ==> Ctx:Parser:PushSymbols ; // Ctx:Parser:PushArray IMMEDIATE VOID operator WordProducer ^L IN aName @SELF Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName |N '@SELF Ctx:SetWordProducerForCompiledClass' '@ operator DO' ';' ] Ctx:Parser:PushArray ; // WordProducer IMMEDIATE VOID operator NamedWordProducer ^L IN aName ^L IN aNewName @SELF Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName |N '@SELF Ctx:SetWordProducerForCompiledClass' aNewName |NS 'Ctx:SetNewWordName' '@ operator DO' ';' ] Ctx:Parser:PushArray ; // NamedWordProducer WordAlias ClassProducer WordProducer NamedWordProducer %INHERITS %G // - список унаследованных элементов NamedWordProducer %CHILDREN %C // - список дочерних элементов элемента IMMEDIATE VOID operator VarProducer ^L IN aName STRING VAR l_Name aName |N >>> l_Name [ 'IMMEDIATE __operator' l_Name '^L IN aName' 'aName |N @SELF __DefineVar' ';' ] Ctx:Parser:PushArray ; // VarProducer IMMEDIATE VOID operator InitedVarProducer ^L IN aName [ 'IMMEDIATE __operator' aName |N '^L IN aName' '^ IN aValue' 'VAR l_NewVar' 'aName |N @SELF __DefineVarEx >>> l_NewVar' 'aValue DO >>>^ l_NewVar' ';' ] Ctx:Parser:PushArray ; // InitedVarProducer operator AllMembers==> // Итерирует все вложенные элементы рекурсивно OBJECT IN anObject ^ IN aLambda FORWARD DoMembers PROCEDURE DoMembers OBJECT IN anObject anObject MembersIterator ==> ( IN aWord aWord aLambda DO aWord DoMembers ) ; // DoMembers anObject DoMembers ; // AllMembers==> STRING FUNCTION strings:CatSep // - складывает строки массива ARRAY IN anArray STRING IN aSep PROCEDURE DoCat STRING IN aStr if ( aStr <> '' ) then begin if ( Result = '') then ( Result := aStr ) else ( if ( aSep Result EndsStr ) then ( Result := ( Result aStr Cat ) ) else ( Result := ( Result aSep Cat aStr Cat ) ) ) end // aStr <> '' ; // DoCat Result := '' @ DoCat anArray ITERATE ; // strings:Cat PROCEDURE __DumpMembers OBJECT IN anObject PROCEDURE Dump OBJECT IN anObject [ anObject pop:Word:Directives anObject LIST %ST Reverted ==> |N anObject |N ] ' ' strings:CatSep . ; // Dump anObject Dump anObject AllMembers==> Dump anObject %P Dump ; // __DumpMembers operator Ctx:Parser:PushSymbolAtRight ^L IN aName aName |N Ctx:Parser:PushSymbol ; // Ctx:Parser:PushSymbolAtRight IMMEDIATE VOID operator NamedInitedVarProducer ^L IN aName ^L IN aNewName @SELF Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName |N '^ IN aValue' 'VAR l_NewVar' aNewName |NS '@SELF __DefineVarEx >>> l_NewVar' 'aValue DO >>>^ l_NewVar' ';' ] Ctx:Parser:PushArray ; // NamedInitedVarProducer NamedInitedVarProducer %DOCUMENTATION %Doc // - документация к элементу IMMEDIATE VOID operator NamedAutolinkProducer ^L IN aOpName ^L IN aName @SELF Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aOpName |N '^ IN aCode' 'aCode ' aName |NS 'Define' ';' ] Ctx:Parser:PushArray ; // NamedAutolinkProducer STRING FUNCTION __CheckSpaces STRING IN aName aName ' ' '%#32' string:Replace >>> Result ; // __CheckSpaces STRING FUNCTION Add<<>> STRING IN aName [ '<<' aName '>>' ] strings:Cat >>> Result Result __CheckSpaces >>> Result ; // Add<<>> STRING FUNCTION Add<<@>> STRING IN aName [ '@' aName ] strings:Cat Add<<>> >>> Result ; // Add<<>> VOID operator DefineStereo IN aName IN aSelf aSelf Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName Add<<>> '^L IN aName' 'aName |N @SELF DefineStereoInstance' 'EXIT' ] Ctx:Parser:PushArray ; // DefineStereo VOID operator DefineStereoInstance IN aName IN aSelf aSelf Ctx:SetWordProducerForCompiledClass [ '__operator' aName __CheckSpaces ] Ctx:Parser:PushArray ; // DefineStereoInstance /*{IMMEDIATE operator StereotypeProducer ^L IN aName @SELF Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName |N Add<<>> '^L IN aName' 'aName |N @SELF DefineStereo' 'EXIT' ] Ctx:Parser:PushArray ; // StereotypeProducer}*/ VOID operator DefineStereotypeProducer IN aName IN aSelf aSelf Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName Add<<>> '^L IN aName' 'aName |N @SELF DefineStereo' 'EXIT' ] Ctx:Parser:PushArray ; // DefineStereotypeProducer IMMEDIATE VOID operator StereotypeStereotypeProducer ^L IN aName @SELF Ctx:SetWordProducerForCompiledClass [ 'IMMEDIATE __operator' aName |N Add<<@>> '^L IN aName' 'aName |N @SELF DefineStereotypeProducer' 'EXIT' ] Ctx:Parser:PushArray ; // StereotypeStereotypeProducer StereotypeStereotypeProducer StereotypeProducer ; WordAlias StereotypeProducer <<@StereotypeProducer>>
Комментариев нет:
Отправить комментарий