среда, 2 декабря 2015 г.

#1223. Переменные времени выполнения, итераторы и фильтры. Расширяем пример. Только код

Код:

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' ;

 BOOLEAN FUNCTION .WasGenerated
   TtfwWord IN aWord
  %SUMMARY 'Определяет тот факт, что слово aWord уже использовалось для генерации' ;

  ARRAY CompileTime-VAR g_WasGenerated []

  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

 : D
  %SUMMARY 'Метод D' ;
 ; // D

 : E
  %SUMMARY 'Метод E' ;
 ; // E

 @[ 
 // - слово @[ открывает массив ССЫЛОК, а не ЗНАЧЕНИЙ
  A A A 
  B B B 
  C C C
  D D D
  E E E 
  A A A 
  B B B 
  C C C
  D D D
  E E E 
 ] 
 %REMARK ' - это массив ССЫЛОК на функции (слова)'
 .filter> ( @ B != )
 %REMARK ' - отфильтровываем значения равные ссылке на B
  ВАЖНО: тут сравниваем УКАЗАТЕЛИ на функции'
 .filter> ( |N 'C' != )
 %REMARK ' - отфильтровываем значения равные ''C''
  ВАЖНО: тут сравниваем ИМЕНА функций'
 .filter> ( @ E != )
 %REMARK ' - отфильтровываем значения равные ссылке на E
  ВАЖНО: тут сравниваем УКАЗАТЕЛИ на функции'
 .filter> ( .WasGenerated ! )
 %REMARK ' - отфильтровываем те слова, которые уже были использованы для генерации
  теперь СПЕЦИАЛЬНО вызываем функцию .WasGenerated ПОСЛЕ всех ОСТАЛЬНЫХ фильтров'
 .map> pop:Word:Name 
 %REMARK ' - мапируем значение на вызов функции pop:Word:Name'
 .for> 
 %REMARK ' - итерируем смапированные значения'
 Print
 %REMARK ' - печатаем каждое итерируемое значение'

; // WasGenerated.ms.script.test

WasGenerated.ms.script.test

Вывод на печать:

VOID TestWithDump WasGenerated.ms.script.test
 %SUMMARY %SUM
  'Метод WasGenerated.ms.script.test'
 ; // %SUMMARY %SUM
 
 BOOLEAN FUNCTION .WasGenerated
  %SUMMARY %SUM
   'Определяет тот факт, что слово aWord уже использовалось для генерации'
  ; // %SUMMARY %SUM
  
  TtfwWord IN aWord
  ARRAY STATIC-VAR g_WasGenerated
  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
 
 : D
  %SUMMARY %SUM
   'Метод D'
  ; // %SUMMARY %SUM
  
 ; // : D
 
 : E
  %SUMMARY %SUM
   'Метод E'
  ; // %SUMMARY %SUM
  
 ; // : E
 
 WasGenerated.ms.script.test
 DumpElement
 ARRAY [
  @
  A
  @
  A
  @
  A
  @
  B
  @
  B
  @
  B
  @
  C
  @
  C
  @
  C
  @
  D
  @
  D
  @
  D
  @
  E
  @
  E
  @
  E
  @
  A
  @
  A
  @
  A
  @
  B
  @
  B
  @
  B
  @
  C
  @
  C
  @
  C
  @
  D
  @
  D
  @
  D
  @
  E
  @
  E
  @
  E
 ]
 (
  @
  B
  !=
 )
 SWAP
 Array:Filter
 (
  |N
  'C'
  !=
 )
 SWAP
 Array:Filter
 (
  @
  E
  !=
 )
 SWAP
 Array:Filter
 (
  .WasGenerated
  !
 )
 SWAP
 Array:Filter
 pop:Word:Name
 SWAP
 Array:Map
 Print
 SWAP
 Array:Iterate
; // VOID TestWithDump WasGenerated.ms.script.test

A
D


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

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