- 论坛徽章:
- 5
|
回复 45# pmerofc
C语言本质上是命令式语言,区别在于他用结构去表示命令。我们先来看看纯粹命令式语言BASIC。BASIC语言由多行语句组成,每行语句的结构是:
命令名 {命令参数}
比如说:
LET I = 10
其中LET就是命令名,而I=10是命令参数。
后期的Basic还有C语言都淡化了这一点,它们将一个结构当成了命令,给予其含义:
if (expr) block {else block}
这样的一个结构被称为一个语句,语句实际上就是命令,只是将简单的命令名(如LET,IF)替换成了一个复杂的结构,以增加其表意能力。
而MoonScript虽然也是以结构主导的,但是它有个特点,这个特点是C不具备的:所有结构都有返回值。
什么意思呢?在C语言里面,有些结构(确切地说,除了表达式外的所有结构都)是没有返回值的,C语言规定只有表达式才能够计算出值和对应类型。而MoonScript里面,所有的结构都有返回值,比如说:
a = if 1 == 1 then 2 else 3
if ... then ... else 是个结构,然而这个结构在执行的时候,其最后一个被执行的语句(或者2,或者3)被当作了这整个if语句的返回值被返回,然后赋值给a了。
再比如:
a = for x = 1, 10 if x % 2 == 0 then x
for 语句也有返回值,返回值是for语句的循环体的返回值的数组(nil被忽略),所以上述语句将a赋值为数组[2,4,6,8]
有了语句返回值,语句和表达式的界限被模糊了,语句也可以被当作表达式,事实上语句就是特殊结构的表达式,这一点和Lisp是相通地(Lisp分为special-form和normal-form,后者是简单函数调用,前者就是语句的等价物),而因为Lisp的语法特性,所以我才说这个特性是从Haskell语言(另外一个函数语言)学来的。这是函数式语言的核心特征(万物皆表达式)。
MoonScript实际上可以认为是亲民版的Lisp,它拥抱了相对正常的语法,失去了Lisp能够操作代码的能力,可谓有得有失。至于得失如何,我觉得后人可以评论。 |
|