Код:
PROGRAM WasGenerated.ms.script USES axiom_push.ms.dict // - в этом словаре описано слово [] ; USES io.ms.dict // - в этом словаре определено слово Print ; USES DogAndBracket.ms.dict // - в этом словаре описано слово @[ ; USES CompileTimeVar.ms.dict // - в этом словаре описано слово CompileTime-VAR ; USES Testing.ms.dict // - в этом словаре описано слово Test&Dump ; Test&Dump WasGenerated.ms.script.test %SUMMARY 'Метод WasGenerated.ms.script.test' ; ARRAY CompileTime-VAR g_WasGenerated [] BOOLEAN FUNCTION .WasGenerated TtfwWord IN aWord %SUMMARY 'Определяет тот факт, что слово aWord уже использовалось для генерации' ; if ( aWord g_WasGenerated array:Has ! ) begin aWord array:AddTo g_WasGenerated false >>> Result end // aValue l_Array array:Has ! else begin true >>> Result end // aValue l_Array array:Has ! ; // .WasGenerated : A %SUMMARY 'Метод A' ; ; // A : B %SUMMARY 'Метод B' ; ; // B : C %SUMMARY 'Метод C' ; ; // C STRING FUNCTION .NameOfWordOrString STRING TtfwWord IN aValue if ( aValue IsString ) then begin aValue >>> Result end // aValue IsString else begin aValue |N >>> Result end // aValue IsString ; // .NameOfWordOrString @[ // - слово @[ открывает массив ССЫЛОК, а не ЗНАЧЕНИЙ A A A B B B C C C A A A B B B C C C ] %REMARK ' - это массив ССЫЛОК на функции (слова)' .filter> ( @ B != ) %REMARK ' - отфильтровываем значения равные ссылке на B ВАЖНО: тут сравниваем УКАЗАТЕЛИ на функции' .filter> ( .WasGenerated ! ) %REMARK ' - отфильтровываем те слова, которые уже были использованы для генерации теперь СПЕЦИАЛЬНО вызываем функцию .WasGenerated ПОСЛЕ всех ОСТАЛЬНЫХ фильтров' .filter> ( .NameOfWordOrString 'C' != ) %REMARK ' - отфильтровываем значения равные ''C'' ВАЖНО: тут сравниваем ИМЕНА функций' .map> pop:Word:Name %REMARK ' - мапируем значение на вызов функции pop:Word:Name' .for> %REMARK ' - итерируем смапированные значения' Print %REMARK ' - печатаем каждое итерируемое значение' g_WasGenerated Print %REMARK ' - печатаем слова участвовавшие в генерации.' ; // WasGenerated.ms.script.test WasGenerated.ms.script.testВывод на печать:
VOID TestWithDump WasGenerated.ms.script.test %SUMMARY %SUM 'Метод WasGenerated.ms.script.test' ; // %SUMMARY %SUM STRING FUNCTION .NameOfWordOrString STRING TtfwWord IN aValue if ( aValue IsString ) then BEGIN aValue Result pop:Word:SetValue END else BEGIN aValue |N Result pop:Word:SetValue END ; // STRING FUNCTION .NameOfWordOrString BOOLEAN FUNCTION .WasGenerated %SUMMARY %SUM 'Определяет тот факт, что слово aWord уже использовалось для генерации' ; // %SUMMARY %SUM TtfwWord IN aWord if ( aWord g_WasGenerated array:Has ! ) then BEGIN aWord >>>[] g_WasGenerated false Result pop:Word:SetValue END else BEGIN true Result pop:Word:SetValue END ; // BOOLEAN FUNCTION .WasGenerated : A %SUMMARY %SUM 'Метод A' ; // %SUMMARY %SUM ; // : A : B %SUMMARY %SUM 'Метод B' ; // %SUMMARY %SUM ; // : B : C %SUMMARY %SUM 'Метод C' ; // %SUMMARY %SUM ; // : C ARRAY STATIC-VAR g_WasGenerated WasGenerated.ms.script.test DumpElement ARRAY [ @ A @ A @ A @ B @ B @ B @ C @ C @ C @ A @ A @ A @ B @ B @ B @ C @ C @ C ] ( @ B != ) SWAP Array:Filter ( .WasGenerated ! ) SWAP Array:Filter ( .NameOfWordOrString 'C' != ) SWAP Array:Filter pop:Word:Name SWAP Array:Map Print SWAP Array:Iterate g_WasGenerated Print ; // VOID TestWithDump WasGenerated.ms.script.test A [ A C ]
Комментариев нет:
Отправить комментарий