摘要: 例:编写一个迭代器,使其可以遍历某个数组的所有排列组合形式。代码如下: 然后,还需要定义其中调用到的打印函数printResult,并以适当的参数来调用permgen: 输出如下: 当生成函数完成后,将其转换为一个迭代器就非常容易了。首先,将printResult改为yield: 然后,定义一个工厂 阅读全文
posted @ 2016-07-19 19:02 月光诗人 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 一个关于协同程序的经典示例是“生产者-消费者”问题。这其中涉及到两个函数,一个函数不断地产生值(比如从一个文件中读取值),另一个则不断地消费这些值(比如将这些值写到另一个文件)。通常,这两个函数大致是这样的: 这里有一个问题是如何将send与receive匹配起来。这是一个典型的“谁具有主循环(wh 阅读全文
posted @ 2016-07-19 18:33 月光诗人 阅读(1412) 评论(0) 推荐(0) 编辑
摘要: 协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西。从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有 阅读全文
posted @ 2016-07-19 17:56 月光诗人 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 本章将介绍如何编写适用于泛型for的迭代其(Iterator)。7.1 迭代器与closurehttp://www.cnblogs.com/moonlightpoet/p/5685275.html7.2 泛型for的语义泛型for在循环过程内部保存了迭代器函数。实际上它保存着3个值:一个迭代器函数、 阅读全文
posted @ 2016-07-19 16:27 月光诗人 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 所谓“迭代器”就是一种可以遍历(iterate over)一种极和中所有元素的机制。在Lua中,通常将迭代其表示为函数。每调用一次函数,即返回集合中的“下一个”元素。每个迭代器都需要在每次成功调用之间保持一种状态,这样才能知道它所在的位置及如何步进到下一个位置。closure对于这类人无提供了极佳的 阅读全文
posted @ 2016-07-19 16:17 月光诗人 阅读(822) 评论(0) 推荐(0) 编辑
摘要: 在Lua中,函数是一种“第一类值(First-Class Value)”,它们具有特定的词法域(Lexical Scoping)。“词法域”:函数可以潜逃在另一个函数中,内部的函数可以访问外部函数中的变量。它允许Lua在应用各种函数式语言(functional-language)中的强大编程技术。L 阅读全文
posted @ 2016-07-19 15:38 月光诗人 阅读(181) 评论(0) 推荐(0) 编辑
摘要: Lua支持“尾调用消除(tail-call elimination)”。尾调用(tail call):当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用”。例如,下面的代码就是一条“尾调用”: 也就是说,当f调用完g之后就再无其他事情可做了。因此在这种情况下,程序就不需要返回那个“ 阅读全文
posted @ 2016-07-19 15:37 月光诗人 阅读(3944) 评论(0) 推荐(0) 编辑
摘要: 词法域:若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为“词法域”。例:假设有一个学生姓名的列表和一个对应于没个姓名的年级列表,需要根据每个学生的年级来对他们的姓名进行排序(由高到低)。可以这么做: 现在假设单独创建一个函数来做这项工作: 上例中有 阅读全文
posted @ 2016-07-19 15:00 月光诗人 阅读(3486) 评论(0) 推荐(0) 编辑