literals指那些值就是它本身的符号。而identifier或者叫标示符,是指它们的值是通过literal来表示的。
例如:
-
"hey"
(a string) -
false
(a boolean) -
3.14
(a real number) -
[1,2,3]
(a list of numbers) -
(x)=> x*x
(a function) -
/^1?$|^(11+?)\1+$/
(a regexp)
-
std::cout
(an identifier) -
foo = 0;
(a statement) -
1+2
(an expression)
这三类与上面6种literals的最大区别是,在编译过程,在它们出现的地方需要再“计算”,一般是“求值”或解引用。而它们的值就是通过literals表现的。因此可以这么说,某程序语言的设计者对literals的种类的划分,决定此种语言的根本特点。也会影响语言的使用者,在编程时对问题的建模的层次。
求值
对变量求值:如果该变量未事先定义,那就会报错。定义变量时,运行时系统会在对应的环境中建立变量的键值对。如果求值操作所在的环境,不是它定义的环境,那么也会报错“未定义变量”。
对函数求值:函数定义了一个抽象模式,包含一系列的操作步骤。对函数的求值,就是按照既定顺序,获取实参,执行这些步骤,然后返回结果。和变量一样,函数也涉及作用域问题。
本质上,操作符和函数是一样的,只不过它们是预先定义在该语言的运行时环境中的。简单的操作符对应单一的机器指令,而复杂的操作符可能需要机器指令的集合,并且需要按照一定顺序。这时,操作符和函数已经没有差别了。函数的抽象层次要高于操作符,因为,函数是操作符、变量和literals的集合,允许用户自定义。