Chinaunix首页 | 论坛 | 博客
  • 博客访问: 406503
  • 博文数量: 57
  • 博客积分: 193
  • 博客等级: 入伍新兵
  • 技术积分: 1192
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-13 14:37
个人简介

当以艺术眼光看程序,寻找程序后面的原理,做到化而不忘

文章分类

全部博文(57)

文章存档

2017年(5)

2015年(7)

2014年(27)

2013年(18)

我的朋友

分类: Windows平台

2015-10-10 23:25:44

对于Lua语言,全局变量和Table可以通过赋值nil来删除。动态删除变量,这个在C中是不可想象的。其实删除估计也不是真正删除,应该是回收内存,分配他用,所以删除的本质是内存管理,也就是说,我们只要在内存管理上面做些文章,就可以提供一些特殊的功能

    比如print("2" + 6), 这个在Lua中是可以正常运行,得到8,在Perl中也可正常运行,得到8,但是在Python是则是非法的,也就是说,在Python中要明确指出每个量的类型,不同类型要转换。而在LuaPerl中由可以自动推导。可见PerlLua是比较随意自然的,更加接近人类语言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实现,没有模块的加载初始化和卸载反初始化机制,这两个机制是模块的标配属性,在PythonRuby中都已经实现了。

       

        Lua的面向对象也是通过table实现的,比如:

Account = {balance = 0}

function Account.withdraw (v)

    Account.balance = Account.balance - v

end

这就定义了一个对象,包括属性balance和方法withdraw,比较随意,也比较扯蛋,连最常用的Class关键字都不提供,看来真是门外汉语言啊。只是追求对象最本质的东西:对象内存分布。这也揭示一点:只要内存布局是对象,就可以实现面向对象,如何得到这样的内存布局,那就无所谓了。我估计在设计之初,根本没想到面向对象,直到后来,仓促应对,才想到使用Table实现面向对象。


阅读(2519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~