摘要:
Lua中的table可以表示其他语言提供的数据结构:数组、记录、线性表、队列、集合等。 在Lua中很少编写搜索算法,因为table本身就提供了直接访问任意类型的功能。 数组 使用整数来索引table即可在lua中实现数组,数组没有固定大小,可以根据需要增长。 通常,在初始化一个数组时,也就间接地定义 阅读全文
摘要:
协同程序与常规的多线程不同之处:协同程序是非抢占式的。 当一个协同程序运行时,是无法从外部停止它的。只有当协同程序显式地调用yield时,它才会停止。 当不存在抢先时,编程会变得简单很多,无须为同步的bug抓狂。 在程序中所有的同步都是显式的,只需要确保一个协同程序在它的临界区域之外调用yield即 阅读全文
摘要:
将循环迭代器视为"生产者-消费者"模式的一种特例:迭代器产生的数据供循环体消费。 因此,用协同程序写迭代器就理所当然了。因为协同程序可以一改传统调用者与被调用者之间的关系。 有了这个特性,在写迭代器时就无须顾及如何在每次成功的迭代调用间保持状态了。 permgen调用如下: 有了迭代器的genera 阅读全文
摘要:
一个关于协同程序的经典示例就是“生产者-消费者”的问题。 一个不断产生值,一个不断消费这些值。比如: 如何将send和receive匹配起来,这是一个典型的“谁有主循环”的问题。由于两则都有一个主循环,并且都将对方视为一个可调用的服务。 协同程序被称为一种匹配生产者和消费者的理想工具,一对resum 阅读全文
摘要:
协同程序与线程差不多,也就是一条执行序列:有自己独立的栈、局部变量、指令指针,以及和其他协同程序共享的全局变量和其他大部分东西。 两者区别在于:一个多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。 一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,而且正在运行的协同程序只会 阅读全文
摘要:
在Lua中,对于大多数程序都不用作任何错误处理,应用程序本身会负责这类问题。 所有的Lua活动都是由应用程序的一次调用开始的,这类调用要求Lua执行一个程序块。 执行过程中发生了错误,此调用会返回一个错误代码(nil ),这样应用程序就能采取适当的行动来处理。 如果需要在Lua中处理错误,则必须使用 阅读全文
摘要:
1、C代码 Lua提供的所有关于动态链接的功能都集中在一个函数中,即package.loadlib. 该函数有两个字符串参数:动态库的完整路径和一个函数名称: loadlib加载指定的库,并将其链接入Lua。不过,它并没有调用库中的任何函数。 相反,它是将一个 C 函数作为Lua函数返回。如果在加载 阅读全文
摘要:
用luac程序可以生成一个预编译文件——二进制文件。 比如: Lua解析器可以执行它就像执行普通lua代码一样。 用lua源代码的地方都可以用预编译代码,loadfile和load也接收预编译代码。 一个简陋的luac: 预编译的代码比源文件执行速度快,但是文件大小不一定比源文件小。 还有一点它可以 阅读全文
摘要:
1、编译 前面介绍的,dofile是一个运行lua代码块的基本操作,实际上它是一个辅助函数。 loadfile才真正做了核心的工作。dofile(打开文件,执行里面的代码块)和loadfile(从文件或stdin中获取代码块)实际不运行代码, 只是编译,然后将结果作为一个函数返回。loadfile与 阅读全文
摘要:
结合泛型for的所有功能,写出更加简单,高效的迭代器。 1、迭代器和closure 迭代器是一种可以遍历集合中所有元素的机制。在Lua中用函数去表示它。 每调用一次,就返回下一个元素。 迭代器在两次成功调用期间,都需要保持一些状态,这样才能知道它所在的位置及如何步进到下一个位置。 closure为此 阅读全文