ToDo: Kontrolle
ToDo: Update Stringlaenge unbegrenzt oder MaxInt?

Hamsterskript: Variablen, Konstanten und Datentypen

Die Abarbeitung von Skripten dient der Verarbeitung von Daten. Diese werden während der Ausführung von Skripten in Variablen gespeichert und durch ihren Wert repräsentiert. Jeder Wert hat einen bestimmten Datentyp, der die auf allen Werten dieses Typs zulässigen Operationen charakterisiert. Der Interpreter entnimmt dem Datentyp auch Art und Größe des für den Wert zu reservierenden Arbeitsspeichers.

Variablen

Variablen sind während ihrer Lebensdauer nicht fest an einen bestimmten Datentyp gebunden und haben immer den Typ des gerade in ihnen gespeicherten Werts. Sie sind zu deklarieren. Die Zeile

var( $MyVar, $MyVar2 )

deklariert beispielsweise die beiden Variablen $MyVar und $MyVar2.

Das Gleichheitszeichen veranlasst eine Zuweisung. Die Zeile

$MyVar = <expression> # alternativ: set( $MyVar, <expression> )

weist der Variablen $MyVar den Wert des Ausdrucks <expression> zu. Ein Ausdruck ist ein Konstrukt, das einen Wert liefert. Die Variable hat dann den Typ dieses Wertes. In einem Skript deklarierte Variablen bleiben erhalten, solange das Skript läuft. Innerhalb eines Prozedurrumpfes deklarierte Variablen bleiben erhalten, solange die Prozedur läuft.

Das Konstrukt

var( $MyVar3 )
$MyVar3 = <expression>

kann auch ersetzt werden durch folgende Funktion:

varset($MyVar3, <expression> )

Hier wird die Variable $MyVar3 deklariert und ihr zugleich der Wert des Ausdrucks <expression> zugewiesen (Definition), dessen Wert die „varset()“-Funktion auch zurückgibt. Soll mehreren Variablen derselbe Ausdruck zugewiesen werden, so ist das möglich durch

varset( $MyVar4, $MyVar5, $MyVar6, <expression> )

Hier werden die drei Variablen $MyVar4 bis $MyVar6 deklariert und ihnen jeweils der Ausdruck <expression> zugewiesen.

Jeder Variablenbezeichner beginnt mit dem Dollarzeichen „$“, gefolgt von Groß- oder Kleinbuchstaben, Ziffern oder dem Unterstrich „_“. Dem Dollarzeichen muss ein Buchstabe folgen. Groß- und Kleinbuchstaben werden nicht unterschieden. Beispiele für gültige Namen:

$a
$i_____
$a_b
$Die_Antwort_ist_WIRKLICH_42

Beispiele für ungültige Namen:

a$
^^ „$“ an der falschen Seite
$__i__
^ Kein Buchstabe als erstes Zeichen
$1st_cut
^ Kein Buchstabe als erstes Zeichen
$a.b
  ^ Punkt ist nicht zulässig
$Die_Antwort_ist_WIRKLICH_42!!!
                            ^^^ Ausrufezeichen sind unzulässig

Die Sichtbarkeit der Variablen kann durch die Funktionen „entercontext“ und „leavecontext“ beeinflusst werden. Die Funktion „entercontext“ eröffnet einen neuen Sichtbarkeitsbereich und die Funktion „leavecontext“ schließt diesen wieder.

Beispiel:

#!hs2
var($a)
$a=42
entercontext("test")
var($a)
$a=999
print($a) # Ausgabe: 999
leavecontext
print($a) # Ausgabe: 42
quit

Konstanten

Konstanten sind während ihrer Lebensdauer fest an einen bestimmten Datentyp gebunden. Sie sind zu deklarieren. Die Zeile

const( $MyConst, <expression> )

deklariert beispielsweise die Konstante $MyConst und weist ihr den Wert <expession> zu. Die Zeile

ConstEnum( $MyConst1, $MyConst2 [ , $MyConst3 , ... , $MyConst100 ] )

deklariert Statuskonstanten und weist ihnen einen aufsteigenden Wert beginnend mit 0 zu.

Beispiel:

ConstEnum( $Null, $Montag, $Dienstag, $Mittwoch, _
           $Donnerstag, $Freitag, $Samstag, $Sonntag )
# $Null erhält den Wert „0“ und ist hier nur eingefügt,
# damit $Montag den Wert „1“ erhält usw.
print ("Donnerstag ist der " + $Donnerstag + ". Tag in der Woche.")

Elementare Datentypen

Der Hamster kennt zwei elementare Datentypen: vorzeichenbehaftete ganze Zahlen (Integer) und Zeichenketten (Strings). Die Funktionen „isint()“ bzw. „isstr()“ prüfen, ob der übergebene Ausdruck eine Zahl bzw. eine Zeichenkette liefert. In diesem Falle geben sie 1 zurück, sonst 0.

Strings können so lang werden, wie Arbeitsspeicher und Swapfile (Auslagerungsdatei) es zulassen. Sie enthalten beliebige Zeichen des ASCII-Zeichensatzes, das Zeichen nul hat hier keine terminierende Wirkung. Beim Größenvergleich etwa zum Zwecke der Sortierung sind die Ordinalwerte (siehe Funktion „ord()“) der Zeichen ausschlaggebend, die Windows-Ländereinstellungen werden nicht berücksichtigt. Die „chr()“-Funktion gibt zu einem Ordinalwert das zugehörige ASCII-Zeichen zurück.

Stringliterale werden in Anführungszeichen ‚"‘ eingeschlossen: ‚"Hallo!"‘. Das Anführungszeichen selbst kann durch doppelte Angabe dargestellt werden: ‚"Hallo ""August"", wie geht's?"‘ würde also als ‚Hallo "August", wie geht's? ‘ ausgegeben.

Das Stringliteral ‚""‘ ist der Leerstring.

Zahlentypen können Werte zwischen -2.147.483.648 (-231) und 2.147.483.647 (231-1) darstellen.

Zahlenliterale sind im dezimal ohne Tausenderpunkte oder hexadezimal anzugeben. Hexadezimale Literale sind durch „0x“ (Ziffer Null, gefolgt vom Kleinbuchstaben x) einzuleiten: 0xFF steht beispielsweise für den Dezimalwert 255. Dezimalen Literalen kann ein Vorzeichen + oder - vorangehen.

Wahrheitswerte (Boolesche Werte) werden durch ganze Zahlen dargestellt. Sie sind das Ergebnis von Ausdrücken oder Funktionen, die eine Bedingung prüfen (Boolesche Ausdrücke), wie etwa die schon erwähnten „isint()“ oder „isstr()“. Die Funktion „true“ liefert den Wert 1, der die Erfüllung einer Bedingung anzeigt; „false“ den Wert 0 für die Nichterfüllung. Jeder von 0 verschiedene Wert wird als erfüllte Bedingung betrachtet.

Strukturierte Datentypen wie Arrays oder Verbunde (Records) kennt der Hamster nicht. Sie können aber durch Listen realisiert werden.

Typenkonversion: In Ausdrücken werden Werte unterschiedlicher Datentypen ggfs. automatisch konvertiert. Zunächst geht der Interpreter beim Gesamtresultat des Ausdrucks von einer Zahl aus. String-Operanden werden vor der weiteren Berechnung in Zahlen konvertiert; falls diese Konversion fehlschlägt (nicht jeder String lässt sich als Zahl interpretieren), ist auch das Gesamtresultat ein String.

In Booleschen Ausdrücken wird jeder von 0 verschiedene Wert wie eine erfüllte Bedingung behandelt.

Es empfiehlt sich aus Gründen der Effizienz und der Klarheit, Typkonversionen explizit vorzunehmen. Die „int()“-Funktion konvertiert einen String in eine Zahl, „str()“ und „hex()“ stellen eine Zahl als String dar.

Dynamische Datentypen

Zeiger: Auf dynamische Datentypen kann nicht direkt, sondern nur über ihre Zeiger zugegriffen werden. Die Zeiger referenzieren direkt den Arbeitsspeicher. Hierzu sind spezielle Funktionen zu verwenden, siehe den Abschnitt Zeiger-Funktionen. Zeiger müssen vor ihrer ersten Verwendung deklariert und initialisiert werden.