我试图了解标识符代表什么以及它们不代表什么。
据我了解,标识符是方法、常量、变量、类、包/模块的名称。它涵盖了很多。但是你不能用它做什么?
每种语言在可以或不能在该语言中命名和重用的实体/抽象方面都不同。
在大多数语言中,您不能将标识符用于中缀算术运算。
例如,plus
是一个标识符,您可以创建一个名为plus
. 但是 write you can write a = b + c;
,没有办法定义一个命名的运算符plus
来a = b plus c;
工作,因为语言语法根本不允许在那里使用标识符。
标识符允许您为某些数据分配名称,以便您以后可以引用它。这就是标识符所做的限制;除了对某些数据的引用之外,您不能“使用”它。
也就是说,这会产生很多影响,有些微妙。例如,在大多数语言中,函数在某种程度上被视为数据,因此函数名称是标识符。在函数是值而不是“一等”值的语言中,您不能在可以将标识符用于其他东西的地方使用函数的标识符。在某些语言中,函数和其他数据甚至会有单独的命名空间,因此文本上相同的标识符可能指代两个不同的事物,并且它们将通过使用它们的上下文来区分。
您通常(即在大多数语言中)不能使用标识符的一个示例是作为对语言关键字的引用。比如这种事情一般是做不到的:
let during = while;
during (true) { print("Hello, world."); }
您可以说它用于您想要多次引用的所有内容,甚至可能一次(但使用它来阐明所指对象的目的)。
可以/不能命名的内容因语言而异,恕我直言,它通常非常直观。
“匿名”实体是没有命名的东西,尽管以某种方式被提及。
#!/usr/bin/perl
$subroutine = sub { return "Anonymous subroutine returning this text"; }
在 Perl 语言中,这是匿名的——子例程没有命名,但它被引用变量 $subroutine 引用。
PS:在 Perl 中,子程序的命名如下:
sub NAME_HERE {
# some code...
}
顾名思义,标识符用于标识某物。因此对于可以唯一标识的所有内容,您可以使用标识符。但是例如文字(例如字符串文字)不是唯一的,因此您不能为其使用标识符。但是,您可以创建一个变量并为其分配一个字符串文字。
把它们煮成汤是相当肮脏的。
在诸如 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
在 common lisp 中,变量绑定和函数绑定是不同的
[19]> (setf hello 'goodbye)
GOODBYE
[20]> hello
GOODBYE
[21]> (hello)
HELLO
HELLO
但在 Scheme 或 JavaScript 中,绑定在同一个命名空间中。
如果将标识符具体化为符号,您还可以对标识符进行许多其他操作。我怀疑在 Lisp 中比我更博学的人将能够证明存在您“无法使用标识符”的任何事情。
但即使是 Lisp 也无法制作标识符汤。
有点左字段的想法,但 JSON 中包含所有这些引号,以消除 JavaScript 关键字弄乱解析的危险。