Esistono linguaggi di programmazione in cui una variabile può veramente conoscere il proprio nome?

5

In PHP e Python si può iterare sulle variabili locali e, se c'è una sola scelta in cui il valore corrisponde, si potrebbe dire che si conosce il nome della variabile, ma questo non sempre funziona. Il codice macchina non ha nomi di variabili. La C si compila all'assemblaggio e non ha alcuna capacità di riflessione nativa, quindi non riconoscerebbe il suo nome. (Modifica: per risposta di Anton il pre-processore può conoscere il nome della variabile).

Esistono linguaggi di programmazione in cui una variabile potrebbe conoscere il suo nome?

Diventa complicato se fai qualcosa come b = a e b non diventa una copia di a ma un riferimento allo stesso posto.

EDIT: Perché nel mondo vorresti questo? Posso pensare ad un esempio: controllo degli errori che può sopravvivere al refactoring automatico. Considera questo snippet in C #:

private void CheckEnumStr(string paramName, string paramValue)
{
    if (paramName != "pony" && paramName != "horse")
    {
        string exceptionMessage = String.Format(
            "Unexpected value '{0}' of the parameter named '{1}'.",
            paramValue,
            paramName);  
        throw new ArgumentException(exceptionMessage);
    }
}
...
CheckEnumStr("a", a); // Var 'a' does not know its name - this will not survive naive auto-refactoring

Ci sono altre librerie fornite da Microsoft e altre che consentono di verificare la presenza di errori (mi dispiace che i nomi mi siano sfuggiti). Ho visto una libreria che con l'aiuto di chiusure / lambda può eseguire un controllo degli errori che può sopravvivere al refactoring, ma non si sente idiomatico. Questa sarebbe una delle ragioni per cui potrei desiderare un linguaggio in cui una variabile conosce il suo nome.

    
posta Job 06.12.2012 - 01:19
fonte

1 risposta

5

Dipende da cosa intendi per nome. Se riformuliamo la domanda come "possiamo estrarre, da qualsiasi variabile, un identificatore univoco per quella variabile", allora in C la risposta è un sì definito: l'operatore di indirizzo ci darà questo. Nel codice:

int x;
// &x now uniquely identifies x (while it is valid).

Se lo riformuliamo come "dato un identificatore, possiamo applicare un'operazione per ottenere una stringa che lo contiene", quindi la risposta in C è ancora una volta sì: possiamo creare una macro che, applicata all'identificatore, lo stringificherà. Ancora una volta nel codice:

#define str(s) str2(s)
#define str2(s) #s

int x;
// str(x) will now be "x"

Se guardiamo nel contesto e C ++ e chiediamo "dato un riferimento lvalue, possiamo ottenere una rappresentazione testuale con la quale questo riferimento è stato definito per la prima volta", la risposta è no. In effetti, non è necessario che tale variabile sia: potremmo avere un riferimento a const inizializzato con un valore.

Sarebbe sicuramente possibile creare un linguaggio simile al C ++, ma dove queste informazioni possono essere trovate. Quindi, teoricamente, esiste un tale linguaggio. Non sono a conoscenza di alcuno che supporti questo nella pratica; la domanda come sopra descritta è per lo più significativa in un linguaggio in cui le cose sono effettivamente dichiarate, e tali linguaggi tendono a evitare il sovraccarico di runtime che ciò richiederebbe.

La reazione da modificare: dipende da come funziona lo strumento di auto-refactoring. Con la soluzione macro, la chiamata sarebbe CheckEnumStr(STR(a), a); . Lo strumento potrebbe decidere di considerare l'invocazione della macro come una chiamata di funzione e rinominare a , oppure espandere la macro e non modificare "a" .

    
risposta data 06.12.2012 - 01:28
fonte

Leggi altre domande sui tag