Weder Ord noch Length sind tatsächlich funktionen, ich glaube der Term dafür ist Intrinsics. Die sehen zwar aus wie Funktionen, werden aber vom Compiler anders behandelt und können damit sachen die Funktionen nicht können.
Length gibt die Länge von arrays und strings zurück. Für statische Arrays wird das zur Kompilezeit einfach durch die Größenkonstante ersetzt, bei Dynamischen Arrays wird gecheckt wenn der Array nil ist dann 0, ansonsten wird der Pointer Dereferenziert und das Längenfeld des Dynamischen Arrays gelesen.
Bei Strings ist es so ähnlich, bei Statische (short)strings wird einfach das erste Byte gelesen, bei dynamischen (Ansi)Strings sehr ähnlich nil -> 0 sonst dereferenziert und Längenfeld des dynamischen Strings gelesen.
Ord ist einfach nur eine Typconversion, die Ordinale typen (d.h. typen die intern als eine Ganzzahl dargestellt werden) in ihre Ordinale Repräsentation überführen. Ordinale typen sind z.B. Enums oder Chars. Ord('A') z.B. ist 65 denn der Character 'A' ist in ANSI (und UTF-8) der Codepunkt 65. Das gegenstück von Ord ist Chr, wobei Chr(65) dann der Char 'A' wäre.
Das ist übrigens eine reine Typrepresentationsänderung zur Compilezeit und führt keinen Laufzeitcode aus, denn Chars werden so oder so zur Laufzeit als Zahlen representiert (am ende sind alles bytes), Ord erlaubt dir nur im Programmcode Chars als Zahlen zu behandeln.
Beispiel, um die Chars '0' bis '9' in die Zahlen 0-9 umzuwandeln, kannst du einfach Ord Benutzen:
Code: Alles auswählen
function CharToNum(c: Char): Integer;
begin
if not (c in ['0'..'9']) then
Exit(-1);
Result := Ord(c) - Ord('0'); // Hiermit wird '0' auf 0 gemapped und alle weiteren zahlen sind einfach linear von hier
end;
Was dein Code Beispiel mit Ord macht ist damit ganz einfach, im ersten Byte eines ShortStrings steht die Länge, allerdings mit der Notation Str[n] greifst du auf die Einzelnen Chars zu, bekommst also den wert als Char typ. Um jetzt damit zu rechnen musst du diesen Char in eine Zahl umwandeln, und das machst du mit Ord.
Pascal ist voll mit solchen Intrinsics, z.B. Exit was oben benutzt ist ist offensichtlich auch keine Funktion, denn eine Funktion die man aufruft kann (bzw sollte es nicht können) die Aufrufende Funktion ändern (in diesem Fall beenden).
Andere Intrisics sind z.B. Write(ln), deshalb geht sowas:
Man kann beliebige parameter beliebigen types angeben, es ist unmöglich eine solche funktion selbst in purem Pascal zu schreiben