Pergunta

Eu estou tentando entender o que identificadores representam eo que eles não representam.

Pelo que entendi, um identificador é um nome para um método, uma constante, uma variável, uma classe, um pacote / módulo. Ele cobre muito. Mas o que você não pode usá-lo?

Foi útil?

Solução

como seus implifies nome, um identificador é usado para identificar alguma coisa. -lo por tudo o que pode ser identificada exclusivamente, você pode usar um identificador. Mas, por exemplo um literal (por exemplo string literal) não é exclusivo para que você não pode usar um identificador para ele. No entanto, você pode criar uma variável e atribuir um literal string para ele.

Outras dicas

A cada difere de língua em termos do que entidades / abstrações pode ou não pode ser chamado e reutilizada nessa língua.

Na maioria das linguagens, você não pode usar um identificador para operações aritméticas infixas.

Por exemplo, plus é um identificador e você pode fazer uma função chamada plus. Mas escrever você pode escrever a = b + c;, não há nenhuma maneira para definir um operador chamado plus para tornar o trabalho a = b plus c; porque a gramática da linguagem simplesmente não permite um identificador lá.

Um identificador permite atribuir um nome a alguns dados, de modo que você pode fazer referência a ela mais tarde. Esse é o limite do que identificadores de fazer; você não pode "uso" que para outra coisa senão uma referência a alguns dados.

Dito isto, há uma série de implicações que vêm desta, algumas sutis. Por exemplo, na maioria dos idiomas funções são, de alguma forma ou de outra, considerada de dados, e assim um nome de função é um identificador. Em linguagens onde as funções são valores, mas não valores "de primeira classe", você não pode usar um identificador para uma função em um lugar que você poderia usar um identificador para outra coisa. Em alguns idiomas, haverá mesmo namespaces separados para funções e outros dados, e então o que é textualmente o mesmo identificador pode referir-se a duas coisas diferentes, e que iria ser distinguidos pelo contexto em que eles são usados.

Um exemplo do que você normalmente (ou seja, na maioria dos idiomas) não pode usar um identificador para é como uma referência a uma palavra-chave da linguagem. Por exemplo, esse tipo de coisa geralmente não pode ser feito:

let during = while;
during (true) { print("Hello, world."); }

Você poderia dizer que é usado para tudo o que você vai querer referir-se a várias vezes, ou talvez até mesmo uma vez (mas usá-lo para esclarecer o propósito do referente).

O que pode / não pode ser nomeado difere por língua, muitas vezes é bastante intuitivo, IMHO.

Um "Anonymous" entidade é algo que não é nomeado, embora referido de alguma forma.

#!/usr/bin/perl
$subroutine = sub { return "Anonymous subroutine returning this text"; }

Em Perl-falar, este é anónimo -. A sub-rotina não é nomeado, mas é referido pela variável de referência $ sub-rotina

PS: Em Perl, a sub-rotina seria nomeado como esta:

sub NAME_HERE {
    # some code...
}

Say, em Java sua lata não algo escrita como:

Object myIf = if;
myIf (a == b) {
    System.out.println("True!");
}  

Assim, você não pode nomear alguma declaração código, dando-lhe um alias. Enquanto em REBOL é perfeitamente possível:

myIf: if
myIf a = b [print "True!"]

O que pode eo que não pode ser nomeado depende da linguagem, como você vê.

Fazendo sopa deles é bastante falta.

Em linguagens como Lisp, um identificador existe em seu próprio direito como um símbolo, enquanto que em idiomas que não são não existem identificadores introspectivas no tempo de execução.

Você escreve um identificador / símbolo literal, colocando uma aspa na frente dele:

[1]> 'a
A

Você pode criar uma variável e atribuir um símbolo literal a ele:

[2]> (setf a 'Hello)
HELLO
[3]> a
HELLO
[4]> (print a)

HELLO 
HELLO

Você pode definir duas variáveis ??para o mesmo símbolo

[10]> (setf b a)
HELLO
[11]> b
HELLO
[12]> a
HELLO
[13]> (eq b a)
T
[14]> (eq b 'Hello)
T

Note que os valores obrigado a b e são os mesmos, e o valor é o símbolo literal 'Olá

Você pode vincular uma função para o símbolo

[15]> (defun hello () (print 'hello))
HELLO

e chamá-lo:

[16]> (hello)

HELLO 
HELLO

lisp comum, a ligao variável e de ligação a função são distintos

[19]> (setf hello 'goodbye)
GOODBYE
[20]> hello
GOODBYE
[21]> (hello)

HELLO 
HELLO

mas no Esquema ou JavaScript as ligações estão no mesmo namespace.

Existem muitas outras coisas que você pode fazer com identificadores, se forem reificado como símbolos. Eu suspeito que alguém mais qualificado do que eu em Lisp será capaz de demonstrar qualquer das coisas que você não pode fazer com identificadores 'existir.

Mas mesmo Lisp não pode fazer identificador de sopa.

Uma espécie de-campo deixou pensou, mas JSON tem todas essas cotações em que a eliminar o perigo de um JavaScript palavra-chave bagunçar a análise.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top