Neuer Syntax in Version 3.3.10.0

    • Offizieller Beitrag

    Hallo,


    Es hat ja mittlerweile schon Tradition, dass es zu Weihnachten meistens eine neue AutoIt stable gibt. So auch dieses Jahr, und diesmal hat sich einiges geändert! Hier ist ein kleines Beispiel, wie sich der Syntax geändert hat - falls ihr Fragen habt, immer her damit, ich hoffe es hilft dem Ein oder Anderen weiter :)



    Gruß,
    Spider


    Edit: Subindex bei Struktur und automatische Array größe hinzugefügt (dank an minx)
    Edit2: Paar kleine Updates

    • Offizieller Beitrag

    Da man Funktionen jetzt Variablen zuweisen kann, ist auch eine Funktion hinzugekommen, mit der man auf native oder User definierte Funktion der Variablen prüfen kann:

    ; == Neue Prüffunktion


    Func _AnyFunc()
    Return True
    EndFunc


    $UserFunc = _AnyFunc
    $NativeFunc = ConsoleWrite


    ConsoleWrite('User Funktion: ' & IsFunc($UserFunc) & @LF) ; 1 = User Funktion
    ConsoleWrite('Native Funktion: ' & IsFunc($NativeFunc) & @LF) ; 2 = Native Funktion


    Funktionen in Variablen ermöglichen nun auch die Verwendung von Funktionen als Parameter anderer Funktionen:

    ; == Funktion als Parameter


    Func _ParameterFunktion($a, $b)
    Return $a + $b
    EndFunc


    Func _Any($x, $param)
    Return $x + $param($x+1, $x+2)
    EndFunc


    $paramF = _ParameterFunktion


    ConsoleWrite( _Any(10, $paramF) & @LF) ; ==> 33


    Der direkte Zugriff auf Elemente von Funktionen, die ein Array zurückgeben ist nicht nur bei integrierten, sondern auch bei selbst erstellten Funktionen möglich:

    ConsoleWrite(_ArrayRet()[2] & @LF) ; ==> "C"


    Func _ArrayRet()
    Local $aRet[] = ['A','B','C','D','E']
    Return $aRet
    EndFunc

  • Das Problem mit dem Index in Structs kann auch ohne Eval sehr einfach gelöst werden.

    For $i = 1 To 4
    ;~ $tStruct.x($i) = $i; Das funktioniert nicht, fehler vom Compiler, wird wohl noch ausgebessert. Stattdessen z.B. die untere Zeile verwenden
    $tStruct.x(($i)) = $i; Mit Klammern funktioniert es
    Next

    Durch die Klammern wird $i in einen Ausdruck dessen Ergebnis $i ist umgewandelt. Und mit Ausdrücken hat der Index kein Problem ;)


    lg
    M

  • Was auch ganz interessant ist:

    ConsoleWrite(obj(100).x & @CRLF)


    Func obj($var)
    Local $tStruct = DllStructCreate('int x')
    $tStruct.x = $var
    Return $tStruct
    EndFunc


  • Yeah! :rock::party::thumbup:

  • Sehr schöne änderungen, danke für den Einblick, kann man sicherlich clever einbauen, ähnelt schon etwas der OOP meiner Meinung.
    :thumbup:

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    • Offizieller Beitrag

    Eines fällt mir gerade beim Thema Structures auf. Die Umsetzung mit der neuen Syntax ist hier leider nicht konsistent.
    Bsp.:


    ; == Strukturen können Bezeichner führen, diese müssen aber aus Buchstaben bestehen
    $tStruct = DllStructCreate("int links;int rechts")
    ; mit neuer Syntax ansprechbar:
    $tStruct.links = 120
    $tStruct.rechts = 70


    ; == Wenn die Felder der Struktur jedoch keine Bezeichner führen, kann die neue Syntax nicht angewendet werden
    ; == Hier wäre eigentlich folgendes sinnvoll und wünschenswert:
    $tStruct = DllStructCreate("int;int")
    ; mit neuer Syntax ansprechen über Nummer des Elements:
    $tStruct.1 = 120
    $tStruct.2 = 70

  • Was leider immernoch nicht geht ist Return [1, 2, 3]

    Func GetArray($a, $b, $c)
    Local $x[] = [$a, $b, $c]
    Return $x
    EndFunc


    Func GetArray2($a, $b, $c) ; Geht nicht
    Return [$a, $b, $c]
    EndFunc


    Func MyFunc($a, $b, $c)
    Return GetArray($a, $b, $c)
    EndFunc

    Kann man selbstnatürlich per Hilfsfunktion ohne weiteres lösen.
    lg
    M

  • Anders als in den (meisten) anderen Sprachen werden Funktionsaufrufe von rechts nach links ausgewertet. Man muss die Klammern selber setzen:


    Func foo()
    Return MsgBox
    EndFunc


    foo()(0, "", "Hello, world!") ; gibt einen fehler


    (foo())(0, "", "Hello, world!") ; so muss es sein