- Offizieller Beitrag
Ich habe mal etwas gespielt.
Die neue Syntax erlaubt uns ja Funktionsaufrufe an eine Variable zu binden und diese dann als Parameter in Funktionen zu nutzen.
Im Bsp. habe ich Generatoren für numerische (ganzzahlig) und A-Z (groß/klein) -Iteratoren erstellt.
Bei jedem Aufruf des Iterators wird der nächste Wert aus dem generierten Zahlenbereich bzw. beim A-Z der Folgebuchstabe zurückgegeben. A-Z kann auch endlos ausgegeben werden, d.h. nach dem Z geht es wieder mit A los.
In erster Linie wird man wohl numerische Iteratoren anwenden. Selbstverständlich kann man mit einer Schleife um einen Funktionsaufruf einen Iterator ersparen. Aber wenn man mehrere Schleifen schachteln muss, kann man sich auf diese Weise evtl. die eine oder andere sparen. Das trägt wiederum durchaus zu etwas mehr Übersicht im Skript bei.
Das einzig störende an dieser Lösung: Ich kann nur eine Instanz eines Iterators generieren. Oder hat da jemand eine Idee, wie man die neuen Syntaxmöglichkeiten dafür verbiegen kann?
Spoiler anzeigen
Func _IteratorNum($_start=Null, $_end=Null, $_create=0)
Local Static $a[1], $index
If $_create Then
$index = -1
Local $n = 0
ReDim $a[$_end +1 -($_start)]
For $i = $_start To $_end
$a[$n] = $i
$n += 1
Next
Return _IteratorNum
Else
$index += 1
Return $index < UBound($a) ? $a[$index] : False
EndIf
EndFunc
$iter = _IteratorNum(-10,5,1)
For $i = 1 To 16
ConsoleWrite($iter() & ' ')
Next
ConsoleWrite(@LF)
Func _IteratorABC($_lower=Null, $_endless=Null, $_create=0)
Local Static $a[26], $index, $continue = False
If $_create Then
$index = -1
Local $n = 0, $x = $_lower ? 97 : 65
For $i = $x To $x +25
$a[$n] = Chr($i)
$n += 1
Next
If $_endless Then $continue = True
Return _IteratorABC
Else
If $continue Then
$index = $index +1 < 26 ? $index +1 : 0
Else
$index += 1
EndIf
Return $index < 26 ? $a[$index] : False
EndIf
EndFunc
$iterUpper = _IteratorABC(0,0,1)
For $i = 1 To 27
ConsoleWrite($iterUpper() & ' ')
Next
ConsoleWrite(@LF)
$iterLower = _IteratorABC(1,0,1)
For $i = 1 To 27
ConsoleWrite($iterUpper() & ' ')
Next
ConsoleWrite(@LF)
$iterUpperEndless = _IteratorABC(0,1,1)
For $i = 1 To 40
ConsoleWrite($iterUpper() & ' ')
Next
ConsoleWrite(@LF)