суббота, 24 июня 2017 г.

Про функторы и итераторы. Простой пример

PROCEDURE .To
  IN aLowBound
  IN aHighBound
  FUNCTOR IN aLambda
 if ( aLowBound <= aHighBound ) then
 // - граничное условие
 begin
  aLowBound aLambda DO // - вызываем aLambda на aLowBound 
  Inc aLowBound // - увеличиваем aLowBound 
  aLowBound aHighBound aLambda call.me
  // - вызываем себя рекурсивно  
 end // ( aLowBound <= aHighBound )
; // .To

FunctorToIterator ( 1 10 ) .To .for .Out 
// - печатает числа от 1 до 10

FunctorToIterator ( 1 10 ) .To 
.filter ( <> 2 ) 
.for .Out 
// - печатает числа от 1 до 10, исключая 2

FunctorToIterator ( 1 10 ) .To 
.filter ( <> 2 ) 
.map ( 1 + ) 
.for .Out 
// - печатает числа от 2 до 11, исключая 3

То же самое, но с параметром справа:
PROCEDURE To
  IN aLowBound
  FUNCTOR IN aLambda
  Right IN aHighBound
 if ( aLowBound <= aHighBound ) then
 // - граничное условие
 begin
  aLowBound aLambda DO // - вызываем aLambda на aLowBound 
  Inc aLowBound // - увеличиваем aLowBound 
  aLowBound aLambda call.me aHighBound
  // - вызываем себя рекурсивно  
 end // ( aLowBound <= aHighBound )
; // To

FunctorToIterator 1 To 10 .for .Out 
// - печатает числа от 1 до 10

FunctorToIterator 1 To 10
.filter ( <> 2 ) 
.for .Out 
// - печатает числа от 1 до 10, исключая 2

FunctorToIterator 1 To 10
.filter ( <> 2 ) 
.map ( 1 + ) 
.for .Out 
// - печатает числа от 2 до 11, исключая 3

Немножко косметики:

ARRAY FUNCTION To
  IN aLowBound
  Right IN aHighBound

 PROCEDURE InnerTo
   IN aLowBound
   FUNCTOR IN aLambda
   Right IN aHighBound
  if ( aLowBound <= aHighBound ) then
  // - граничное условие
  begin
   aLowBound aLambda DO // - вызываем aLambda на aLowBound 
   Inc aLowBound // - увеличиваем aLowBound 
   aLowBound aLambda call.me aHighBound
   // - вызываем себя рекурсивно  
  end // ( aLowBound <= aHighBound )
 ; // InnerTo

 FunctorToIterator aLowBound InnerTo aHighBound
 >>> Result
; // To 

1 To 10 .for .Out 
// - печатает числа от 1 до 10

1 To 10
.filter ( <> 2 ) 
.for .Out 
// - печатает числа от 1 до 10, исключая 2

1 To 10
.filter ( <> 2 ) 
.map ( 1 + ) 
.for .Out 
// - печатает числа от 2 до 11, исключая 3

Ещё косметики:
ARRAY FUNCTION To
  IN aLowBound
  Right IN aHighBound

 PROCEDURE InnerTo
   IN aLowBound
   FUNCTOR IN aLambda
   Right IN aHighBound
  if ( aLowBound <= aHighBound ) then
  // - граничное условие
  begin
   aLowBound aLambda DO // - вызываем aLambda на aLowBound 
   Inc aLowBound // - увеличиваем aLowBound 
   aLowBound aLambda call.me aHighBound
   // - вызываем себя рекурсивно  
  end // ( aLowBound <= aHighBound )
 ; // InnerTo

 FunctorToIterator aLowBound InnerTo aHighBound
 >>> Result
; // To 

PROCEDURE for
  ARRAY Right anArray
  FUNCTOR Right aLambda
 anArray .for> aLambda  
; // for

for ( 1 To 10 ) 
.Out 
// - печатает числа от 1 до 10

for
( 1 To 10
.filter ( <> 2 ) 
)
.Out 
// - печатает числа от 1 до 10, исключая 2

for 
( 1 To 10
.filter ( <> 2 ) 
.map ( 1 + ) 
)
.Out 
// - печатает числа от 2 до 11, исключая 3


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

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