blob: edd1d7ca805312614c2e830cfe7bbbfc5bbabe32 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
program tforin2;
// test operator Enumerator for the string type and built-in into RTL TStrings enumerator
{$mode objfpc}{$H+}
{$apptype console}
uses
Classes;
type
{ TStringEnumerator }
TStringEnumerator = class // reverse enumerator
private
FString: String;
FIndex: Integer;
function GetCurrent: Char; inline;
public
constructor Create(AString: String);
function MoveNext: Boolean;
property Current: Char read GetCurrent;
end;
{ TStringEnumerator }
function TStringEnumerator.GetCurrent: Char;
begin
Result := FString[FIndex];
end;
constructor TStringEnumerator.Create(AString: String);
begin
inherited Create;
FString := AString;
FIndex := Length(FString) + 1;
end;
function TStringEnumerator.MoveNext: Boolean;
begin
dec(FIndex);
Result := FIndex > 0;
end;
// define an operator for the string type
operator enumerator (const s: string): TStringEnumerator;inline;
begin
Result := TStringEnumerator.Create(s);
end;
procedure LoopString(s: string);
function getstring(s: string): string;
begin
result:=s;
end;
var
c: char;
begin
// check loop in string. output is 'tset' for the string 'test' :)
for c in getstring(s) do
write(c);
WriteLn;
end;
procedure LoopClass;
var
L: TStringList;
S: String;
begin
L := TStringList.Create;
L.Add('1');
L.Add('2');
L.Add('3');
for S in L do
WriteLn(S);
L.Free;
end;
begin
LoopString('test');
LoopClass;
end.
|