![]() |
Re: Goto
Zitat:
Sinnbefreites Beispiel für die nichtssagende Erklärung :freak: :
Delphi-Quellcode:
Könnte man so benutzen:
type
Sample = class public class method Test(startValue, endValue : Integer) : sequence of Integer; iterator; end; implementation class method Sample.Test(startValue, endValue : Integer) : sequence of Integer; begin for i : Integer := startValue to endValue do yield i; end;
Delphi-Quellcode:
Der wirklich Iterator (oder Enumerator in MS-speak) wird vom Compiler als eine state machine umgesetzt, die bei jedem Aufruf auf MoveNext zum nächsten yield springt.
for i in Sample.Test(2, 10) do
Console.WriteLine(i); |
Re: Goto
Oje, muss gestehen, daß ich so etwas noch nie benutzt habe. Danke für den anschaulichen Code. Wenn ich mal Zeit habe, werde ich mir ihn mal genauer anschauen!! Thanx.
SCRaT |
Re: Goto
@Markus
Vom Meister selbst: ![]() Das Fehlen von GOTO in späteren Wirth-Sprachen zeigt ja sehr deutlich, daß er es selbst für überflüssig hielt. Aber ob das "Meister" Tobi überzeugt? @SCRaT Das geht (leider nicht ganz so schön wie in Chrome) auch in neueren Delphi-Versionen: ![]() Gruß Hawkeye |
Re: Goto
Zitat:
Hier noch die Delphi-Umsetzung von Elvis' Beispiel:
Delphi-Quellcode:
Die marginal vergrößerte Codelänge kann angesichts der Tatsache, dass dieser Iterator in beide Richtungen funktioniert, wohl vernachlässigt werden :zwinker: .
type
TForLoopEnumerator = class // *hust* Interfaces? *hust* fTo, fCurrent: Integer; public constructor Create(aFrom, aTo: Integer); function MoveNext: Boolean; property Current: Integer read fCurrent; end; TForLoop = class fFrom, fTo: Integer; public function GetEnumerator: TForLoopEnumerator; property From: Integer read fFrom write fFrom; property &To: Integer read fTo write fTo; end; { TForLoopEnumerator } constructor TForLoopEnumerator.Create(aFrom, aTo: Integer); begin fCurrent := aFrom - Sign(aTo - aFrom); // MoveNext wird bereits vor dem ersten // Schleifendurchgang aufgerufen, also musse fCurrent künstlich einen Schritt // zurückgesetzt werden fTo := aTo; end; function TForLoopEnumerator.MoveNext: Boolean; begin Result := fCurrent <> fTo; Inc(fCurrent, Sign(fTo - fCurrent)); end; { TForLoop } function TForLoop.GetEnumerator: TForLoopEnumerator; begin Result := TForLoopEnumerator.Create(From, &To); end; var i: Integer; loop: TForLoop; begin loop := TForLoop.Create; loop.From := 10; loop.&To := -1; for i in loop do Writeln(i); Readln; end. Zitat:
![]() ![]() [edit]Einmal Editieren ist dem Cache wohl zu wenig :stupid: .[/edit] |
Re: Goto
sequences sind IEnumerable<T>, nur nicht so hässlich. Gab ja bereits "array of". :)
|
Re: Goto
Zitat:
![]() |
Re: Goto
Hi,
was hat das alles noch mit goto zu tun? :warn: Mfg FAlter |
Re: Goto
Zitat:
|
Re: Goto
Delphi-Quellcode:
???? :mrgreen: :mrgreen: :mrgreen:
goto Hell;
|
Re: Goto
Goto 3 ist doch schon viel besser. Die liegt hier vor mir auf dem Tisch. Wetten ? :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz