Existem linguagens de programação onde uma variável pode realmente saber seu próprio nome?

5

No PHP e no Python, pode-se iterar sobre as variáveis locais e, se houver apenas uma escolha em que o valor corresponde, você poderá dizer qual é o nome da variável, mas isso nem sempre funciona. O código da máquina não tem nomes de variáveis. C compila para a montagem e não possui nenhum recurso de reflexão nativa, portanto, não saberia seu nome. (Editar: por resposta de Anton, o pré-processador pode saber o nome da variável).

Existem linguagens de programação onde uma variável saberia seu nome?

Fica complicado se você fizer algo como b = a e b não se tornar uma cópia de a , mas uma referência ao mesmo local.

EDIT: Por que você quer isso? Posso pensar em um exemplo: verificação de erros que pode sobreviver à refatoração automática. Considere este snippet 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

Existem outras bibliotecas fornecidas pela Microsoft e outras que permitem verificar erros (desculpe, os nomes me escaparam). Eu vi uma biblioteca que com a ajuda de closures / lambdas pode realizar a verificação de erros que pode sobreviver à refatoração, mas não parece idiomática. Esta seria uma razão pela qual eu poderia querer uma linguagem onde uma variável saiba seu nome.

    
por Job 06.12.2012 / 01:19
fonte

1 resposta

5

Depende do que você quer dizer com nome. Se reformularmos a questão como "podemos extrair, de qualquer variável, um identificador único para essa variável", então, em C, a resposta é um sim definitivo: o operador de endereço nos dará isso. No código:

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

Se nós reformulá-lo como "dado um identificador, podemos aplicar uma operação a ele para obter uma string contendo ele", então a resposta em C é mais uma vez sim: podemos fazer uma macro que, aplicada ao identificador, vai restringir isso. Mais uma vez no código:

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

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

Se olharmos no contexto e no C ++ e perguntarmos "dada uma referência de lvalue, podemos obter uma representação textual com a qual essa referência foi definida pela primeira vez", a resposta é não. De fato, não precisa haver tal variável: podemos ter uma referência a const que foi inicializada com um rvalue.

Definitivamente, seria possível criar uma linguagem semelhante ao C ++, mas onde essa informação pode ser encontrada. Assim, teoricamente, tal linguagem existe. Não tenho conhecimento de nenhum que apóie isso na prática; A pergunta, como foi feita acima, é mais significativa em uma linguagem onde as coisas são de fato declaradas, e tais linguagens tendem a se afastar da sobrecarga de tempo de execução que isso exigiria.

Reação para editar: isso depende de como a ferramenta de refatoração automática funciona. Com a solução de macro, a chamada seria CheckEnumStr(STR(a), a); . A ferramenta pode decidir tratar a chamada de macro como uma chamada de função e renomear o a ou expandir a macro e não modificar o "a" .

    
por 06.12.2012 / 01:28
fonte