Hi
Based on discussion about "for in" I want to suggest my proposition.
When we investigate some code, sometimes we found pattern:

Pattern 1:
/  begin
   startfun;
   try
     ...
   finally
     stopfun;
   end;
/  end;

Pattern 2:
 for i:= startfun to stopfun do begin
    ....
 end;


Pattern 3:
 startfun;
 while stopfun do begin
   ...
 end;


Common for all mentioned patterns are two connected functions, which controlled running of body source. First make all initializations, second helping with iterations and finalizations.

My proposition is make possibility of join, those pair to one sentence. All patterns can be change to one common template:

  if startfun then repeat
  until stopfun;
I You see we need two function with boolean result. Of course possibility of parameters give wide appliance.

To preserve  pascalish  style I propose something like this:

tMyObject = class(tObject)
  function startfun:boolean;
  function stopfun:boolean;
 property lambdafun; start startfun stop stopfun;
end;

and invoke:
var
  t : tMyObject;
 begin
  ..
  t.lambdafun do begin
     ....
  end;
 end;

because on declaration side is similar do properties (also two function) we can use the same syntax. Only keyword start and stop exchange read and write.

To using i thought about WITH, but it may confusing bit, thus I propose omit, and only use keyword DO.

Why lambda. Because is very similar to constructing no name procedures and use them as normal. We have few mechanism controlling runnig: IF, REPEAT, WHILE, FOR. They work well, but sometimes they are week. For example we don't have enough primitives do build own implementation FORIN method, on iterators also. But in Lisp any mechanism, any sequence of computing collection can be done and source is very readable
 lisp syntax: (lambda (<formal parameters>) <body>)
This is not unusual, but we can send this declaration as argument of procedure.
Of course syntax like this
  tlist.foreach( procedure (x : tObject);begin writeln(x) end)

is ugly (thought I sow something similar in  C++/boost)
but when we change it a bit:

 tlist.foreach(x) do  begin
   writeln(x);
 end;

its not so strange

Because my english is very poor I only show some application

EXP. mutex (and patterns as RIAA)

   tMutex = class
     property makeatomic; start lock stop unlock;
   end;
 .....

 begin
   tMutex.makeatomic do begin
     ...
   end;
end;
EXP: foreach


  tMyList = class
function tMyList.start:boolean;
    begin
      current:=first;
result:=current<>nil; end;
    function tMyList.stop:boolean;
    begin
      current:=next(current);
       resutl:=current<>nil;
end;

When attributes are added, or exception caching this will be more flexible.





--
 Darek





_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to