08 2016 档案
摘要:协同程序与常规的多线程不同之处:协同程序是非抢占式的。 当一个协同程序运行时,是无法从外部停止它的。只有当协同程序显式地调用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为此
阅读全文
摘要:Lua函数是具有特定词法域的第一类值,与其他传统类型的值(string and number)具有相同的权利。 它可以保存在变量和table中,也可以把它当参数传递,也可以作为返回值。 在Lua中有个容易混淆的概念,函数与所有其它值一样都是匿名的,即他们没有名称。 当讨论一个函数名(print),实
阅读全文
摘要:修改系统时区,发现只需要一个命令就可以解决 修改之前: cp /usr/share/zoneinfo/Asia/Chongqing /etc/localtime 修改之后:
阅读全文
摘要:在lua中,函数是语句和表达式体现的主要机制。函数可以完成某些特定的任务、计算和返回执行结果。 前者当成一个语句,后者当成一个表达式: 在这两种情况下,调用函数都要用一个括号携带一系列参数去表示。如果函数不带参数,也需要用空的括号去表示。 但是有几个特列括号是可以省略的: Lua为针对面向对象的调用
阅读全文
摘要:Lua手册中的string.len (s) 接收一个字符串,返回其长度。 空串 "" 的长度为 0 。 内嵌零也统计在内,因此 "a\000bc\000" 的长度为 5 。 对于"\000"这样的转义字符不了解,看了Lua程序设计,上面提到。 转义字符可以通过数值来指定字符串中的字符,数值以转义序列
阅读全文

浙公网安备 33010602011771号