使用的是lua for delphi扩展,文件共有5个,一个dll,4个pas。
lua版本是5.0.2,可以点击这里下载。
写了一个简单的demo,delphi主程序完成对lua扩展的加载,同时对用户输入的日期以及当前日期进行比较,lua文件完成对比较结果的文字化输出。代码如下:
test.lua
- function dayinfo(num)
- local strdayinfo;
- if (num==0) then
- strdayinfo="今天";
- elseif (num>0) then
- strdayinfo=num.."天前";
- elseif (num<0) then
- strdayinfo=math.abs(num).."天后";
- end
- print(strdayinfo);
- end
相关文章
在这一章中(下面关于标准库的几章中同样)我的主要目的不是对每一个函数给出完整地说明,而是告诉你标准库能够提供什么功能。为了能够清楚地说明问题,我可能会忽略一些小的选项或者行为。主要的思想是激发你的好奇心,这些好奇之处可能在参考手册中找到答案。
Read the rest of this entry »
相关文章
Lua自动进行内存的管理。 程序只能创建对象(表,函数等),而没有执行删除对象的函数。通过使用垃圾收集技术, Lua会自动删除那些失效的对象。 这可以使你从内存管理的负担中解脱出来。更重要的,可以让你从那些由此引发的大部分BUG中解脱出来,比如指针挂起(dangling pointers)和内存溢出。
和其他的不同,Lua的垃圾收集器不存在循环的问题。 在使用循环性的数据结构的时候,你无须加入特殊的操作;他们会像其他数据一样被收集。 当然,有些时候即使更智能化的收集器也需要你的帮助。 没有任何的垃圾收集器可以让你忽略掉内存管理的所有问题。
Read the rest of this entry »
相关文章
Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;表也有芷冢胨唇ㄋ裁词焙虼唇ㄋ薰亍?
对象有他们的成员函数,表也有:
Account = {balance = 0}
function Account.withdraw (v)
Account.balance = Account.balance – v
end
这个定义创建了一个新的函数,并且保存在Account对象的withdraw域内,下面我们可以这样调用:
Account.withdraw(100.00)
相关文章
很多语言专门提供了某种机制组织全局变量的命名,比如Modula的modules,Java和Perl的packages,C++的namespaces。每一种机制对在package中声明的元素的可见性以及其他一些细节的使用都有不同的规则。但是他们都提供了一种避免不同库中命名冲突的问题的机制。每一个程序库创建自己的命名空间,在这个命名空间中定义的名字和其他命名空间中定义的名字互不干涉。
Lua并没有提供明确的机制来实现packages。然而,我们通过语言提供的基本的机制很容易实现他。主要的思想是:像标准库一样,使用表来描述package。
使用表实现packages的明显的好处是:我们可以像其他表一样使用packages,并且可以使用语言提供的所有的功能,带来很多便利。大多数语言中,packages不是第一类值(first-class values)(也就是说,他们不能存储在变量里,不能作为函数参数。。。)因此,这些语言需要特殊的方法和技巧才能实现类似的功能。
Lua中,虽然我们一直都用表来实现pachages,但也有其他不同的方法可以实现package,在这一章,我们将介绍这些方法。
Read the rest of this entry »
相关文章
Lua用一个名为environment普通的表来保存所有的全局变量。(更精确的说,Lua在一系列的environment 中保存他的”global”变量,但是我们有时候可以忽略这种多样性) 这种结果的优点之一是他简化了Lua的内部实现,因为对于所有的全局变量没有必要非要有不同的数据结构。另一个(主要的)优点是我们可以像其他表一样操作这个保存全局变量的表。为了简化操作,Lua将环境本身存储在一个全局变量_G中,(_G._G等于_G)。例如,下面代码打印在当前环境中所有的全局变量的名字:
for n in pairs(_G) do print(n) end
这一章我们将讨论一些如何操纵环境的有用的技术。
Read the rest of this entry »
相关文章
Lua中的table由于定义的行为,我们可以对key-value对执行加操作,访问key对应的value,遍历所有的key-value。但是我们不可以对两个table执行加操作,也不可以比较两个表的大小。
Metatables允许我们改变table的行为,例如,使用Metatables我们可以定义Lua如何计算两个table的相加操作a+b。当Lua试图对两个表进行相加时,他会检查两个表是否有一个表有Metatable,并且检查Metatable是否有__add域。如果找到则调用这个__add函数(所谓的Metamethod)去计算结果。
Lua中的每一个表都有其Metatable。(后面我们将看到userdata也有Metatable),Lua默认创建一个不带metatable的新表
t = {}
print(getmetatable(t)) –> nil
可以使用setmetatable函数设置或者改变一个表的metatable
t1 = {}
setmetatable(t, t1)
assert(getmetatable(t) == t1)
任何一个表都可以是其他一个表的metatable,一组相关的表可以共享一个metatable(描述他们共同的行为)。一个表也可以是自身的metatable(描述其私有行为)。
相关文章
当我们处理数据文件的, 一般来说,写文件比读取文件内容来的容易.因为我们可以很好的控制文件的写操作,而从文件读取数据常常碰到不可预知的情况.一个健壮的程序不仅应该可以读取存有正确格式的数据还应该能够处理坏文件(译者注:对数据内容和格式进行校验,对异常情况能够做出恰当处理).正因为如此,实现一个健壮的读取数据文件的程序是很困难的.
正如我们在Section 10.1(译者:第10章Complete Examples)中看到的例子,文件格式可以通过使用Lua中的table构造器来描述.我们只需要在写数据的稍微做一些做一点额外的工作,读取数据将变得容易很多.方法是:将我们的数据文件内容作为Lua代码写到Lua程序中去.通过使用table构造器,这些存放在Lua代码中的数据可以像其他普通的文件一样看起来引人注目.
Read the rest of this entry »
相关文章
table是Lua中唯一的数据结构,其他语言所提供的其他数据结构比如:arrays, records, lists, queues, sets等,Lua都是通过table来实现,并且在lua中table很好的实现了这些数据结构.
在传统的C语言或者Pascal语言中我们经常使用arrays 和lists(record+pointer)来实现大部分的数据结构,在Lua中不仅可以用table完成同样的功能,而且table的功能更加强大.通过使用table很多算法的实现都简化了,比如你在lua中很少需要自己去实现一个搜索算法,因为table本身就提供了这样的功能.
我们需要花一些时间去学习如何有效的使用table,下面我们通过一些例子来看看如果通过table来实现一些常用的数据结构.首先,我们从arrays 和lists开始, 不仅因为它是其他数据结构的基础,而且是我们所熟悉的.在第一部分语言的介绍中,我们已经接触到了一些相关的内容,在这一章我们将再来完整的学习他。
Read the rest of this entry »
相关文章
我们看两个完整的例子来阐明Lua语言的使用.第一个例子来自于Lua网站,他展示了Lua作为数据描述语言的使用.第二个例子讲解了马尔可夫链算法的实现,这个算法在Kernighan & Pike著作的Practice of Programming书中也有描述.这两个完整的例子之后颐墙崾鳯ua语言方面的介绍,后面将继续介绍table和面向对象的内容以及标准库,C-API等.
Read the rest of this entry »