2012-03-27 9 views
6

Rein als eine Übung zu Hause, zielte auf etwas Sprache Grundlagen zu verstehen, versuchte ich die Ord Funktion neu zu implementieren, aber ich stieß auf ein Problem.Ord Funktion Implementierung in Delphi

In der Tat, die bestehenden Ord Funktionsargumente von einer Vielzahl von verschiedenen Typen annehmen können (AnsiChar, Char, WideChar, Enumeration, Integer, Int64) und kann Integer oder Int64 zurückzukehren.

Ich kann nicht herausfinden, wie mehrere Versionen der gleichen Funktion zu deklarieren.

Wie sollte dies in Delphi codiert werden?

Antwort

9

Ord kann nicht in Delphi codiert werden. Obwohl Sie the overload directive verwenden können, um mehrere Funktionen mit demselben Namen zu schreiben, können Sie die Ord Funktion auf diese Weise nicht schreiben, da es für eine beliebige Anzahl von Argumenttypen funktioniert, ohne mehrere Definitionen zu benötigen. (Egal, wie viele Ord Überlastungen Sie schreiben, kann ich kommen immer mit einem Typ, der Ihre Funktionen werden nicht akzeptieren, sondern dass der Wille des Compilers.)

Es funktioniert so, weil der Compiler Magie. Der Compiler kennt Ord und alle ordinalen Typen im Programm, also führt er die Aktionen der Funktion in-line aus. Andere Compiler-magische Funktionen umfassen Length (magisch, weil es beliebige Array-Typen akzeptiert), Str (magisch, weil es Modifizierer für Breite und Präzision akzeptiert) und ReadLn (magisch, weil es eine beliebige Anzahl von Parametern akzeptiert).

+0

Dies ist die richtige Antwort auf die Frage, auf die im Titel verwiesen wird. – boileau

+0

Ich bin nicht ganz davon überzeugt, dass "ord" im aktuellen Delphi unmöglich wäre, indem man untypisierte Parameter + etwas RTTI-Chaos verwendet. Aber zugegeben, zumindest wäre es sehr unpraktisch! –

+0

@Joonas, untypisiert bedeutet, dass es * nein * gibt. Sie können keine Typinformationen von etwas erhalten, das keinen Typ hat. Wenn Sie vorgeschlagen hätten, * Generika * zu verwenden, könnte es Hoffnung geben. –

12

Ich kann nicht herausfinden, wie mehrere Versionen der gleichen Funktion zu deklarieren.

Es heißt function overloading. Eingabeparameter müssen für jede Version unterschiedlich sein, Rückgabetyp spielt keine Rolle. Zum Beispiel:

function Ord(X: Char): Integer; overload; 
begin 
    // Whatever here 
end; 

function Ord(X: Integer): Integer; overload; 
begin 
    // Something 
end; 

// etc. 
+4

Beachten Sie, dass "ord" eine spezielle magische Funktion und keine normale Pascal-Funktion ist. Denken Sie daran, dass "ord" existierte, lange bevor die überladene Funktion der Sprache hinzugefügt wurde. –

+0

Richtig, und wenn es zu Lernzwecken neu implementiert wird, ist es besser, es anders als "ord" zu bezeichnen! –

+2

Als Randnotiz zu Davids Kommentar: Die Implementierung von Ord ist eigentlich nichts, da es keinen extra Opcode erzeugt. Es wurde weit zurück in der ursprünglichen Pascal-Beschreibung von N. Wirth deklariert und weist den Compiler nur an, den Typkonflikt zu ignorieren. Also in der Tat: schlechtes Beispiel ... –