2009-03-29 2 views
0

Я пытаюсь понять, что представляют identifiers и что они не представляют.Что вы не можете использовать для идентификатора?

Как я понимаю, идентификатор - это имя для метода, константы, переменной, класса, пакета/модуля. Он охватывает много. Но что вы не можете использовать?

ответ

0

как его имя подразумевает, для идентификации чего-то используется идентификатор. поэтому для всего, что можно идентифицировать однозначно, вы можете использовать идентификатор. Но, например, литерал (например, строковый литерал) не уникален, поэтому вы не можете использовать для него идентификатор. Однако вы можете создать переменную и присвоить ей строковый литерал.

+0

Почему строка литерала не уникальна? – 2009-03-29 19:36:23

+0

, потому что вы можете сказать var a = "Hello"; var b = "Hello"; – Ender

+0

ах да. Спасибо. – 2009-03-29 19:43:37

3

Каждый язык отличается тем, какие сущности/абстракции могут или не могут быть названы и использоваться повторно на этом языке.

1

Можно сказать, что оно используется для всего, что вы хотите сослаться на несколько раз, а может быть, даже на один раз (но используйте его для уточнения цели референта).

Что может/не может быть названо, отличается по языку, это часто довольно интуитивно, ИМХО.

«Анонимный» объект - это то, что не названо, хотя и упоминается как-то.

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

В Perl-говорят, это анонимный - подпрограмма не названа, но это называется ссылочной переменной $ подпрограммой.

PS: В Perl, подпрограмма будет называться так:

sub NAME_HERE { 
    # some code... 
} 
1

Say, в Java вы не можете написать что-то вроде:

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

Итак, вы не можете назвать код , давая ему псевдоним. В то время как в REBOL это вполне возможно:

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

Что может и что не может быть названо в зависимости от языка, как вы видите.

0

Сделать суп из них довольно фол.

В таких языках, как Lisp, идентификатор существует в своем собственном праве как символ, тогда как в языках, которые не являются интроспективными идентификаторами, не существует во время выполнения.

Вы пишете буквальное идентификатор/символ, поставив апостроф перед ним:

[1]> 'a 
A 

Вы можете создать переменную и присвоить символ буквального к нему:

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

HELLO 
HELLO 

Вы можете установите две переменные на один и тот же символ

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

Обратите внимание, что значения, связанные с b и a, являются собственными е, а значение является буквальным символом «Hello

Вы можете привязать функцию к символу

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

и называете его:

[16]> (hello) 

HELLO 
HELLO 

В общей шепелявости, переменные связывания и функциональное связывание

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

HELLO 
HELLO 

, но на схеме или JavaScript привязки находятся в одном пространстве имен.

Есть много других вещей, которые вы можете сделать с идентификаторами, если они охарактеризованы как символы. Я подозреваю, что кто-то более осведомленный, чем я, в Lisp, сможет продемонстрировать любые вещи, которые вы не можете сделать с идентификаторами.

Но даже Lisp не может сделать идентификационный суп.

2

Идентификатор позволяет присвоить имя некоторым данным, чтобы впоследствии вы могли ссылаться на него. Это предел того, что делают идентификаторы; вы не можете «использовать» его ни для чего, кроме ссылки на некоторые данные.

Тем не менее, есть много последствий, которые приходят от этого, некоторые тонкие. Например, в большинстве языков функции в той или иной степени считаются данными, поэтому имя функции является идентификатором. В языках, где функции являются значениями, но не являются «первоклассными» значениями, вы не можете использовать идентификатор для функции в месте, где вы могли бы использовать идентификатор для чего-то другого. На некоторых языках существуют даже отдельные пространства имен для функций и других данных, и поэтому текстовый идентичный идентификатор может ссылаться на две разные вещи, и они будут отличаться контекстом, в котором они используются.

Пример того, что вы обычно используете (например, на большинстве языков), не может использовать идентификатор, является ссылкой на ключевое слово языка. Например, такого рода вещи, как правило, не может быть сделано:

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

Сортировать из левого поля мысли, но JSON имеет все эти цитаты в нем, чтобы устранить опасность ключевого слова JavaScript портя разборе.

3

В большинстве языков вы не можете использовать идентификатор для арифметических операций infix.

Например, plus является идентификатором, и вы можете сделать функцию с именем plus. Но напишите, что вы можете написать a = b + c;, нет способа определить оператор с именем plus, чтобы сделать работу a = b plus c;, потому что языковая грамматика просто не позволяет там идентифицировать.

Смежные вопросы