lua工具库penlight--09技术选择
模块化和粒度
在理想的世界,一个程序应该只加载它需要的库。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里一直保持的风格,这样模块不会破坏全局环境 ;此外, stringx.import()没有使用是因为它将更新全局字符串表。
但在脚本里require ‘pl’是更方便;问题是如何保证一个不加载整个库,而且方便。该战略是仅在引用它们的时候加载模块。在 'init.lua' (在require ‘pl’时加载) 里,元表附加到具有__index metamethod 的全局表。任何未知名称的会在模块列表中查找,如果找到,我们加载它,并使该模块全局可用。所以当遇到tablex.deepcompare时, tablex会引起 'pl.tablex'加载。.
修改全局表的行为会造成后果。例如,著名的strict模块,也包括 Lua 本身 (也许是用Lua 本身写的唯一 Lua标准模块),也不会被修改。这样,全局变量在使用之前必须定义 。所以 'init.lua' 允许未找到的钩子,正是'pl.strict.lua' 使用的。其他库可能会安装自己到_G,metatables,但Penlight现在会将任何未知的名称转发到原始的__index元表。
但是该战略还得努力: 旧 '厨房水槽' 'init.lua' ,会引入大约 260 K 的字节码,而现在典型的程序使用大约 100 K 和短的脚本更少 — — 例如,如果他们只需要在utils中的功能 .
有一些函数把它们的输出表标记为特殊的元表,这样看起来很合适。例如,tablex.makeset 创建一个Set , seq.copy创建一个List 。但这并不会导致自动加载pl.Set 和pl.List;只有当您尝试访问的它们的任意方法。在 'utils.lua',有一个叫stdmt的导出表:
stdmt = { List = {}, Map = {}, Set = {}, MultiMap = {} }
如果你去查看'init.lua',这些普通的小 '识别' 表会获取__index metamethod ,来强制加载全部功能。这里是来自 'list.lua' 启动list的代码:
List = utils.stdmt.List
List.__index = List
List._name = "List"
List._class = List
“按需加载”战略帮助库模块化。特别是对于随便使用,require ‘pl’是方便和模块化的折衷。
在当前版本中,我减少了奇技淫巧。以前,Map 被定义在pl.class ;现在它明智地定义在pl.Map ;pl.class只包含基本类机制 (并返回该函数)。为保持一致性,List 直接由require ‘pl.List’ (注意大写的 'L')返回,此外,减少了像pl.config的非核心库中的模块依赖关系。
定义什么调用
'utils.lua' 导出的function_arg 在整个Penlight中广泛使用。它定义了什么是 '可调用'。显然 函数传递立即回。但字符串呢?第一个选项是它表示在 'operator.lua'中的运算符,这样 ' <' 是只是operator.lt 的别名.
然后,我们检查是否有为元表定义的函数工厂。
(字符串可调回是真的,但在实践中这变成了一个可爱但半信半疑的想法,因为所有字符串都共享同一个元表。一个常见的编程错误是将错误类型的对象传递给一个函数。获得一个干净的'试图调用字符串' 消息比一些晦涩的跟踪要好)。
注册一个函数工厂的其他模块是pl.func 。占位符表达式不能直接调用,因此需要被实例化和缓存,以作为可能有效的方式。
(不一致的情况是, utils.is_callable不对此进行彻底的检查。)
lua工具库penlight--09技术选择的更多相关文章
- lua工具库penlight--01简介
lua的设计目标是嵌入式语言,所以和其它动态语言(如python.ruby)相比其自带的库缺少很多实用功能. 好在有lua社区有Penlight,为lua提供了许多强大的功能,接下来的几篇博客,我会简 ...
- lua工具库penlight--02表和数组
类Python的List lua的优美之处在于把数组和关联数组都用table实现了(Python中叫list和dict,C++中叫vector和map). 一般我们把数字索引的table叫做list. ...
- lua工具库penlight--07函数编程(一)
函数编程 序列 Lua 迭代器 (最简单的形式) 是一个函数,可以多次调用返回一个或多个值.for in语句理解迭代器和循环,直到该函数将返回nil. Lua有标准的序列迭代器 (ipairs和pai ...
- lua工具库penlight--06数据(二)
词法扫描 虽然 Lua 的字符串模式匹配是非常强大,但需要更强大的东西.pl.lexer.scan可以提供标记字符串,按标记机分类数字.字符串等. > lua -lpl Lua 5.1.4 C ...
- lua工具库penlight--08额外的库(一)
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 ...
- lua工具库penlight--07函数编程(二)
列表压缩 列表压缩是以紧凑的方式通过指定的元素创建表.在 Python里,你可以说: ls = [x for x in range(5)] # == [0,1,2,3,4] 在 Lua,使用pl.c ...
- lua工具库penlight--04路径和目录
使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl ...
- lua工具库penlight--06数据(一)
这篇太长了,分了两部分.(这个是机器翻译之后我又校对了一下,以后的都这样,人工翻译太累了.) 读数据文件 首先考虑清楚,你的确需要一个自定义的文件读入器吗?如果是,你能确定有能力写好吗? 正确,稳健, ...
- lua工具库penlight--03字符串
字符串提取函数 这些方法也是从Python借鉴来的,但索引从1开始.stringx定义了一些函数如isalpha和isdigit, 用来判断字母和数字:startswith和endswith可以方便用 ...
随机推荐
- OpenGL入门学习(转载)
说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...
- Python函数的循环调用
def foo (): print 'runing foo' bar () def bar (): print 'runing bar' foo () bar() 直接上脚本,上面的脚本如果换成C语言 ...
- 转自http://bbs.linuxtone.org/thread-1062-1-1.html
详细参考:http://wiki.codemongers.com/NginxChsHttpMainModule worker_processes指明了nginx要开启的进程数,据官方说法,一般开一个就 ...
- 关于listview,scrollview显示模糊边缘的设置
朋友们有时可能在开发中遇到这样的莫名其妙的问题,listview或scrollview滑动时上边和下边会出现两条模糊的边缘,有时会影响到我们app的视觉效果,我们怎么去掉这两条模糊的边缘呢?很简单,一 ...
- vue - router 起步
官方API:https://router.vuejs.org/zh/guide/#javascript vue-cli for index.js export default new Router({ ...
- JQuery 之CSS操作
JQuery 之CSS操作 设置 <p> 元素的颜色: 将所有段落的颜色设为红色 $(".btn1").click(function(){ $("p" ...
- vue + 百度地图api
主要分解为如下步骤: (1)在html文件中引入百度地图, <script type="text/javascript" src="http://api.map.b ...
- 【Android】在build/envsetup.sh中添加自己的命令(函数)
由于测试的需要,经常需要手动刷入boot.img和system.img,把它写到envsetup.sh就可以每次使用一行命令来代替了: function flashtestimage(){ if [[ ...
- Hadoop-1.2.1学习之Job创建和提交源码分析
在Hadoop中,MapReduce的Java作业通常由编写Mapper和Reducer開始.接着创建Job对象.然后使用该对象的set方法设置Mapper和Reducer以及诸如输入输出等參数,最后 ...
- 一致Hash算法
一致性哈希算法是分布式系统中经常使用的算法.比方,一个分布式的存储系统,要将数据存储到详细的节点上.假设採用普通的hash方法.将数据映射到详细的节点上,如key%N.key是数据的key.N是机器节 ...