2012-01-03 16 views
13

Dichiarare le variabili in Delphi mi ha portato a considerare una cosa che non riesco a capire.Delphi parole e identificatori riservati

La domanda è questa: dichiarando stringhe, si può osservare che string è una parola riservata, pur dichiarando di altri tipi di dati, dicono gli interi, il tipo di dati di qualificazione non è una parola riservata, ma un identificatore (cioè Integer, la capitale mi dice così).

Infatti, Delphi ti permette di andare alla definizione di Integer, che si scopre è contenuto all'interno dell'unità di sistema, ma è solo rappresentativo, perché non v'è un commento che indica che alcune costanti (come True), identificatori (come Integer), le funzioni e le procedure sono direttamente integrate nel compilatore.

Non riesco a capire le ragioni di questa scelta.

Qualcuno potrebbe aiutare?


Una piccola spiegazione della differenza tra string e Integer tipi. Il codice successivo

type 
    Integer = Char; 

var 
    I: Integer; 

begin 
    I:= 'A'; 
    ShowMessage(I); 
end; 

è corretto e funziona come previsto, mentre la successiva linea

type 
    string = Integer; 

dà a tempo di compilazione errore.

+4

Delphi è * non * case-sensitive. –

+2

Sì, lo sapevo. Sebbene Delphi non rilevi la distinzione tra maiuscole e minuscole, è considerata una buona pratica di programmazione capitalizzare secondo la convenzione InfixCaps. Lo so anch'io. –

+5

+1, poiché è una domanda interessante, anche se potrebbe non esserci una risposta "definita". La mia ipotesi personale, tuttavia, è che il tipo 'string' è circondato da tanta magia del compuler che è stato promosso a una 'parola riservata' piuttosto che a 'Ctrl + digitabile su un tipo incorporato' ... –

risposta

7

Per quanto ne so string è una parola riservata dai tempi Turbo Pascal. Quindi la ragione per mantenerla in questo modo deve essere la compatibilità.

Pascal -> Turbo Pascal -> Object Pascal -> Delphi.

Controllare queste risorse.

+2

Inizialmente, credo, 'stringa' è stato classificato da Borland come uno dei cosiddetti tipi 'strutturati', insieme a' array' e 'record', perché aveva elementi sintattici aggiuntivi (parentesi quadre, l'identificatore della lunghezza massima). Doveva quindi diventare una parola riservata, da analizzare in un modo speciale, a differenza dei tipi semplici, che erano solo identificatori, come "Integer" o "Real". –

+0

@AndriyM Ha ancora elementi sintattici aggiuntivi –

+1

@DavidHeffernan: Sì, se usato in "alla vecchia maniera", viene automaticamente considerato un "ShortString", lo so. Il mio punto è che inizialmente era * rigorosamente * un tipo strutturale. Ora è più spesso usato come un semplice tipo di stringa (puntatore) (sintatticamente), e probabilmente deve rimanere una parola riservata a causa del supporto dell'uso più vecchio. –

4

string deve essere una parola riservata, perché non è utilizzato esclusivamente per fare riferimento al tipo System.[Ansi|Unicode]String. Se string fosse un semplice alias per un tipo di compilatore interno, allora string[20] non funzionerebbe più. Questo non è un problema per Integer, perché Integer significa sempre nient'altro che "il tipo System.Integer".

+1

Dubito che stringa * deve * essere una parola riservata; Preferirei pensare che fosse più semplice per un disegnatore di compilatori turbo pascal implementare 'string' come parola riservata. – kludg

+0

Ebbene si. Potresti * creare un parser che permetta qualsiasi tipo di 'tipo [lunghezza]' e genera un errore se 'type' è qualcosa di diverso da' stringa', o se 'stringa' non si risolve in' System.UnicodeString'. Ma perché dovresti? – hvd