[Lazarus] Valladolid Programming Contest simple test fails at compile?

Thierry Coq tcoq at free.fr
Thu Mar 26 22:16:32 CET 2009


HI
  Sorry, this shuld be new topic on pascal devel list, but on other side 
this is reply on those post.


> On Thu, Mar 26, 2009 at 12:29 PM, Alexander Klenin <klenin at gmail.com> wrote:
>   
>>> And I assume that by "lack of iterators" you mean in-language iterators?
>>>       
>> Of course. What else?
>>     
>
> External iterators without the need for implementing descendants. But
> I must agree, it would really be nice if we can incorporate iterators
> in all list/container classes.
>
> Would the FPC developers accept such a patch?  With unit tests of
> coarse. :-)  It will not break anything, because it never existed
> before - not in Delphi or FPC.  But it would make FPC classes a lot
> more user friendly.
>
>   
>> versus
>>
>> var
>>  item: TItem;
>> ...
>> for item in obj.Items do begin
>>  ... item ... item ...
>> end;
>>
>> the latter is safer, simpler and more clear code.
>>     
>
>
> var
>   itr: ITBStringIterator;
> begin
>   itr := gIteratorFactory..StringIterator(MyStringList);
>   while MyStringIterator.HasNext do
>     writeln(itr.Next); //  .Next does not increment the iterator.
>     ...
>     // do something else with itr.Next
>   end;
>   // itr gets free'ed automatically for us...
> end;
>
>
>   
Traverse through container (list, array) has many approaches. In pascal 
we have 3 loop. Each of them is different.
FOR is fastest, may include initialization:  for i:=itr.start to itr.last do
but is impossible to change  way of computation in runtime (i think 
about change of direction, count )
and is no finalization

REPEAT and WHILE: here is impossible to add default initialization, but 
finalization yes. In loop body we can change everything.
thus in my program I use

  for i := itr.start to itr.last do

or

  if itr.start do repeat
  until itr.last;

 It was be nice to have  in language something like this:
 
interface
 tTest = class
  function start:boolean;
  function last:boolean;
  property iterator begin start stop last;
....
implementation
var
  t : tTest
begin
   t.iterator do
   begin
   end;

end;

that will be equivalent to

begin
  if t.start then repeat
 until t.last.
end;

but then can be test by compiler (if we use both function of pair)
in this construction we can achieve  flexible iterator and  pattern RAII 
(exception handling should be added)
and even invoke function with locking

property locking begin lock stop unlock;

t.locking do something;

Of course when i think that this is valuable, I should prepare path. But 
alone cant do this: too much code to understand on beginning.
I need assistance of core developer: where start, what use. I this its 
similar to generic parser (I think).
I may start from test cases (of course after discussion about syntax)

-- 
  Darek







More information about the Lazarus mailing list