Sprachreferenz

Folgende Informationen dienen als Hilfestellung, um den Einstieg in die Verwendung von F-Script Blöcken zu erleichtern.

Schlüsselwörter

Jede Programmiersprache kennt vordefinierte reservierte Wörter, welche als Schlüsselwörter (Keywords) bezeichnet werden.
Variablen oder Funktionen dürfen nicht identisch wie reservierte Schlüsselwörter heissen. Wird dies aus Versehen trotzdem getan führt dies zu folgendem Fehler:
Error-160 ..\FF\PLW-BLOCK.FX #9: 
ReadNextInterpreterLine: Expression-Syntax-Error: Parsing failed (A recognition error occurred.):
[Line 14/ Char 6]: '	var )))n(((ull := 0'
Unexpected Token: RESERVED_KEYWORD

Kommentare

Kommentare können in F-Script Blöcken folgendermassen definiert werden:
F-Script-Block_01.jpg
Notiz
Notiz
Die F-Script Extension für VSCode färbt Kommentare abhängig des Begriffs hinter // unterschiedlich ein.

Expressions

Expressions (ApsFunctions)

Sämtliche Expressions können uneingeschränkt verwendet werden.
Verwenden Sie bei Expressions folgende Form:
«X(TestString=Lorem ipsum dolor sit amet)»
«
{
    // bei Expressions ist lediglich der Name und die Argumente nötig.
    // Länge
    length(X('TestString'))
    // länge
    replaces('',X('TestString'),'-')
    // heute    
    today()
    // Rechnen
    number(10)*number(20)
}
»

Expression-Konstanten

Zusätzliche Expression-Konstanten

F-Script Blöcke kennen die beiden Konstanten TRUE und FALSE (Datentyp Boolean).
«
{
    // Zuweisung eines Booleans
    var isActive := TRUE
        isActive := FALSE
}
»

Expression-Operatoren

Expression-Operatoren

Grundsätzlich stehen alle Operatoren, welche auch in Expressions verfügbar sind zur Verfügung.
Folgende Operatoren stehen zusätzlich zur Verfügung:
Zuweisungsoperator
«
{
    // Der Zuweisungs-Operator ist eine Abkürzung...
    var a := 1
    // ... für
    var b := 0 
    assign(b, 1) 
}
»
Increment und Decrement
«
{
    var i := 1
    // increment    
    ++i
    // decrement
    --i
}   
»

Lokale typisierte Variablen

In F-Script Blöcken werden lokale typisierte Variablen (local typed vars) unterstützt.
Für die Verwendung gelten folgende Regeln:
  • Case-Sensitiv und beginnend mit Kleinbuchstaben
  • Erlaubte Zeichen: a-zA-Z und _
  • Definition mittels Schlüsselwort var
  • Zuweisung mittels assign() oder Operator :=
  • Der Datentyp ist nachträglich nicht änderbar
  • Casting geschieht implizit!
Wichtig
Wichtig
Beachten Sie, dass bei einer Zuweisung ohne explizite Angabe des Datentyps die neue Variable automatisch den Datentyp des ersten Wertes erhält!
Folgendes Beispiel zeigt die Problematik auf:
«
{
    // ACHTUNG: 10 ist Datentyp <integer> > result AUCH <integer>!
    // Resultat: 0  
    var resultAsInteger := 10 / 100                     
    
    // TIPP: Angabe von explizitem Datentyp > result AUCH <number>
    // Resultat: 0.1
    var resultAsNumber := number(10) / number(100)      
}
»

Datentypen von lokalen Variablen

Im Gegensatz zu z.B X-Variablen besitzen lokale typisierte Variablen einen impliziten Datentyp.
Folgende Datentypen stehen zur Verfügung:
«
{
    // Zuweisung Strings
    var messageText := ""
    // Zuweisung Integer
    var myInteger   := 100
    // TIPP: besser ist eine explizite Angabe.
        myInteger   := integer(100)
    // Zuweiung Number (float)
    var myNumber    := 100.01
    // TIPP: besser ist eine explizite Angabe.
        myNumber    := number(100.01)
    // Zuweisung Boolean
    var yesOrNo     := TRUE
    // Zuweisung Datum
    var myDate      := 05.04.1980
    // TIPP: besser ist eine explizite Angabe.
        myDate      := date(05.04.1980)
}
»
Achtung
Achtung
Der Datentyp einer Variablen kann nachträglich nicht geändert werden! Wird dies versucht führt dies zu folgender Fehlermeldung:
Error-160 ..\FF\PLW-BLOCK.FX #42: ReadNextInterpreterLine: Expression-Syntax-Error: Token 'FUNCTION_NAME' is invalid: Error while visiting Function 'assign': 'StringToBoolean(Hello)' failed: 
Parsing Biz-String into Number failed: Die Eingabezeichenfolge hat das falsche Format. Parametername: str
Der tatsächliche Wert war Hello. [Line 51/ Char 10/ Token 'FUNCTION_CALL']

Schleifen und Verzweigungen

F-Script Blöcke erlauben die Verwendung von Schleifen und Bedingungen:
If-/Else-Bedingungen
«
{
    var numberVar := 1000
    if(numberVar = 0)
    {  }

    if(numberVar >=9999)
    {
        // do something
    }
    else
    {
        // do something else
    }
}
»
While-Schleife
«
{
    var numberVar := 0
    while(numberVar < 10)
    {
       // do something
        ++numberVar
    }
}
»
For-Schleife
«
{
    for(var i := 1, i <10, ++i)
    {
        // do something
    }
}
»

Benutzerdefinierte Funktionen

Benutzerdefinierte Funktionen (functions)

F-Script Blöcke können durch benutzerdefinierte functions strukturiert werden. Diese können Argumente entgegennehmen, Werte retournieren oder vom Typ void sein (keine Argumente/Rückgabe).
«
{
    //  function mit default-Value wenn "nichts" übergeben wird
    function GetValue(var myArg := 1)   
    { 
        if(myArg = 1) 
        { 
            return myArg+5      // Erste Return-Anweisung bestimmt Return-Datentyp: Integer
        } 
        else 
        { 
            return 08.11.1973   // ACHTUNG: Cast zu Integer: integer(08.11.1973)
        } 
    }

    function Main()             // Funktion ohne Rückgabe (void)
    {
        // Funktion aufrufen und Resultat speichern
        var result1 := GetValue()
        var result2 := GetValue(1)
    }
    // INFO: Es wird empfohlen eine function Main() zu implementieren (Beginn des Codes)
    Main()
}
»
Wichtig
Wichtig
Da F-Script Blöcke zur Laufzeit kompiliert werden, müssen Funktionen, welche aufgerufen werden, jeweils vor (oberhalb) stehen damit diese bereits bekannt sind!
Wird dies nicht eingehalten führt dies zu folgender Fehlermeldung:
Error-160 ..\FF\PLW-BLOCK.FX #135: ReadNextInterpreterLine: 
Expression-Syntax-Error: Token 'FUNCTION_NAME' is invalid: 
Function 'Main' not available [Line 138/ Char 4/ Token 'FUNCTION_NAME']

Fehlerhandling

Fehlerhandling (Exceptions und Messages)

Für das Fehlerhandling stehen folgende Möglichkeiten zur Verfügung:
throw
Mit dem Befehl throw kann innerhalb eines Blockes eine Exceptions ausgelöst werden. Dies führt zu einer Rückgabe als Error wie man dies vom Befehl «SYS(MSG ERROR <meldung>)» kennt.
«
{
    // ACHTUNG: dies führt zu einem Fehler!
    throw "something went wrong"
}
»

Libraries

Innerhalb eines Block-Script haben Sie die Möglichkeit, Libraries einzubinden. Das Einbinden einer Library erfolgt dabei mit folgendem Befehl:
using "ScriptBlockLibrary.FBL"
Wichtig
Wichtig
Beachten Sie, dass für Block-Script Libraries lediglich die Dateiendung .FBL erlaubt ist.
Beispiel
{
    // Test-Code
    using "Library_15A.FBL"

    function Main()
    {
        var resultString := LibraryA()
        SYS("MSG INFO " + resultString)
...
...
...
    Main()
}
Zugehörige Library (Library_15A.FBL)
{
    // Library-File 
    function LibraryA()
    {
        // Inhalt LibraryA
        return "Hey overthere, this is the return value."
    }
}