lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简译Penlight的wiki. 目的 常有人说lua不带电池.因为lua的目标是可以运行在各种机器上的简洁语言,(有些机器甚至不 支持布尔系统).lua类似于操作系统内核(注:即不是完整的系统,只有基本功能),lua的作者 并没有把围绕lua开发完整的生态系统看做自己的职责.这是社区的角色. 软件设…
列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)]  # == [0,1,2,3,4] 在 Lua,使用pl.comprehension : > C = require('pl.comprehension').new() > = C ('x for x=1,10') () {1,2,3,4,5,6,7,8,9,10} C是一个函数,它将一个列表字符串编译成一个函数.在这种情况下,该函数有没有参数.考虑一个字…
函数编程 序列 Lua 迭代器 (最简单的形式) 是一个函数,可以多次调用返回一个或多个值.for in语句理解迭代器和循环,直到该函数将返回nil. Lua有标准的序列迭代器 (ipairs和pairs) , io.lines是返回文件中的所有行的迭代器.在的Penlight库中,这种迭代器也称为序列.单个值 (比如从io.lines ) 的序列称为单值,由pairs定义的序列是双值. pl.seq提供一些有用的迭代器和一些操作序列的函数.乍一看本示例尝试在Lua写里 Python (有序列)…
词法扫描 虽然 Lua 的字符串模式匹配是非常强大,但需要更强大的东西.pl.lexer.scan可以提供标记字符串,按标记机分类数字.字符串等. > lua -lpl Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio > tok = lexer.scan 'alpha = sin(1.5)' > = tok() iden    alpha > = tok() =       = > = tok() iden    sin…
这篇太长了,分了两部分.(这个是机器翻译之后我又校对了一下,以后的都这样,人工翻译太累了.) 读数据文件 首先考虑清楚,你的确需要一个自定义的文件读入器吗?如果是,你能确定有能力写好吗? 正确,稳健,快速,当如先得把第一项处理好. 在Unix世界里常见的数据文件夹是配置文件.在Java世界里也被叫做属性文件. # Read timeout in seconds read.timeout=10 # Write timeout in seconds write.timeout=10 下面是简单的Lu…
模块化和粒度 在理想的世界,一个程序应该只加载它需要的库.Penlight需要额外100 Kb 的字节码来工作.它是简单但却乏味要加载你需要什么: local data = require 'pl.data' local List = require 'pl.List' local array2d = require 'pl.array2d' local seq = require 'pl.seq' local utils = require 'pl.utils' 这是我在Penlight里一直…
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 Lua 代码结束看上去像 Perl,因为字符串模式不容易阅读,尤其是对普通读者而言.这段代码需要了解三种不同的日期格式: -- parsing dates using Lua string patterns months={Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6, J…
使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl.path提供了与Python中os.path里相同的功能. > p = 'c:\\bonzo\\DOG.txt'  > = path.normcase (p)  ---> only makes sense on Windows c:\bonzo\dog.txt > = path.sp…
类Python的List lua的优美之处在于把数组和关联数组都用table实现了(Python中叫list和dict,C++中叫vector和map). 一般我们把数字索引的table叫做list.penlight里的List模仿了Python,看起来从Python借鉴是个好主意. 下面是一个List的例子,List实现了__tostirng,因此可以输出自己.  ) ),},}{,,,},){,,,,} ,,,} )  ) true > = l:reverse()  ---> note: …
字符串提取函数 这些方法也是从Python借鉴来的,但索引从1开始.stringx定义了一些函数如isalpha和isdigit, 用来判断字母和数字:startswith和endswith可以方便用来查找子串(endswith可以用来判断后缀 ,如f:endswith{'.bat','.exe','.cmd'}):还有对齐方法just和除去空白符的strip.  > stringx.import() > ('bonzo.dog'):endswith {'.dog','.cat'} true…