On 01.11.2015 00:11, Jonas Maebe wrote:
On 31/10/15 21:28, Ondrej Pokorny wrote:
The argument that the tenumeratornode concept is completely different
from other nodes is correct - but if you think about the syntax you will
see that also the syntax is completely different from other pascal
syntax so you need such a unique node.

That is a very good argument not to add it...

Yes, my argument that the "syntax is completely different from other pascal syntax" is misleading. I put it wrong. It is not different - its a new extension within the current pascal syntax:

E.g. the code
*  for s in Self.StringArray do**
**    Writeln(s);**
* would compile even now if *StringArray* was an "array of xyz" or a class/record/interface with GetEnumerator function. The syntax is already present in Pascal. I only want to extend it for array properties (this extension is new and unique).

The fact that the syntax is unique ensures that no legacy code can be broken. I personally don't think that adding many new compiler features is necessary, but this one really is useful - with this syntax you could easily and systematically add enumerators to a lot of different properties in the RTL/LCL you cannot use in a for-in loop now:
- TWinControl.Controls
- TStrings.Names
- TStrings.Objects
- TStrings.Values
- TStringGrid.Cols
- TStringGrid.Rows
- TStringGrid.Cells
- etc, etc

Michael liked it as well: http://lists.freepascal.org/pipermail/fpc-devel/2015-October/036110.html

---

+ I was wrong about the need to use "tenumeratornode". Actually you can use "tcallnode" and get *pd* and *expr* for *create_enumerator_for_in_loop* from its properties in function *create_for_in_loop*:
expr:=tcallnode(expr).methodpointer;
pd:=tprocdef(tcallnode(expr).symtableprocentry.ProcdefList[xyz]); // (you have to find the compatible overload) (If you don't know what I mean I can send you the code. It's working like a charm.)

The only thing we need is a new flag/whatever so that *create_for_in_loop* knows that "tcallnode(expr)" contains an enumerator function. tnode.flags seems to be full :( Do you have any suggestions? If we sort this out, 2 more arguments against it are nil :)

Ondrej

_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to