Iteratoren generieren

    • 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
    [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $iter = _IteratorNum(-10,5,1)
    For $i = 1 To 16
    ConsoleWrite($iter() & ' ')
    Next
    ConsoleWrite(@LF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $iterUpper = _IteratorABC(0,0,1)
    For $i = 1 To 27
    ConsoleWrite($iterUpper() & ' ')
    Next
    ConsoleWrite(@LF)

    [/autoit] [autoit][/autoit] [autoit]

    $iterLower = _IteratorABC(1,0,1)
    For $i = 1 To 27
    ConsoleWrite($iterUpper() & ' ')
    Next
    ConsoleWrite(@LF)

    [/autoit] [autoit][/autoit] [autoit]

    $iterUpperEndless = _IteratorABC(0,1,1)
    For $i = 1 To 40
    ConsoleWrite($iterUpper() & ' ')
    Next
    ConsoleWrite(@LF)

    [/autoit]