当以艺术眼光看程序,寻找程序后面的原理,做到化而不忘
全部博文(57)
分类: Windows平台
2015-10-10 23:25:44
对于Lua语言,全局变量和Table可以通过赋值nil来删除。动态删除变量,这个在C中是不可想象的。其实删除估计也不是真正删除,应该是回收内存,分配他用,所以删除的本质是内存管理,也就是说,我们只要在内存管理上面做些文章,就可以提供一些特殊的功能。
比如print("2" + 6), 这个在Lua中是可以正常运行,得到8,在Perl中也可正常运行,得到8,但是在Python是则是非法的,也就是说,在Python中要明确指出每个量的类型,不同类型要转换。而在Lua和Perl中由可以自动推导。可见Perl和Lua是比较随意自然的,更加接近人类语言,Python还是比较保守的,更加接近程序本质,更加有程序员气质,它依赖于程序员自己来做出判断。
Perl是由语言学家发明的,可以说,这个语言和程序员眼中的编程语言还是有比较大的差距的,这导致了其风格诡异,代码可读性差。Perl中有个上下文的概念,在不同上下文化中,同一个变量其表现物理意义不同,这和正常的人类语言,比如同一个单词在不同上下文中意义不同,多么相似啊。这就有点太随意了,也是C系列程序员所难以理解的地方,毕竟出身不同啊。
Lua字符串连接是两个点号:..。Perl字符串连接是一个点号:.。Python中则是最自然的加号:+。
Lua中,table是比较万能的,它可以用来构建其它不同数据类型,比如数字,字典,数组等。Lua也是通过table来解决模块,包,对象等机制的。比如string.format表示使用”format”来索引table string。表使用关联型数组,可以用任何值为作为数组索引,这个在Python中是不行的。Python数组是数组,字典是字典,二者界限很明显。在Lua中,可以比较自由使用,如下所示:
mytable = {}
print("mytable 的类型是 ",type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "修改前"
print("mytable 索引为 1 的元素是 ", mytable[1])
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
可以看出,表的使用很随意,很符合日常人类语言,很可能发明这个语言的人也不是程序员出身的,估计也是个语言学家。
Lua5.1才开始加入标准的模块管理机制,以前竟然缺失,这在程序员看来,简直不可思议,再次证明了这是一门“门外汉”发明的语言,另外,Lua也不支持正则表达式。而模块竟然又是由table实现,没有模块的加载初始化和卸载反初始化机制,这两个机制是模块的标配属性,在Python和Ruby中都已经实现了。
Lua的面向对象也是通过table实现的,比如:
Account = {balance = 0}
function Account.withdraw (v)
Account.balance = Account.balance - v
end
这就定义了一个对象,包括属性balance和方法withdraw,比较随意,也比较扯蛋,连最常用的Class关键字都不提供,看来真是“门外汉”语言啊。只是追求对象最本质的东西:对象内存分布。这也揭示一点:只要内存布局是对象,就可以实现面向对象,如何得到这样的内存布局,那就无所谓了。我估计在设计之初,根本没想到面向对象,直到后来,仓促应对,才想到使用Table实现面向对象。