D.H.Q的烂笔头

Just code for fun~

Articles about: Lua

利用 Luerl 在 Heroku 上搭建基于 Erlang 的 Lua Web Shell

其实刚开始接触 Lua 时,就想着能不能也做一个像之前的 Erlang Web Shell 那样方便调试 Erlang 代码的东西出来。一番了解后,Lua 里的 loadstring 函数和 loadfile 函数可以动态解释 Lua 的表达式,不过经过一些测试,发现需要的执行结果却很难返回来,例如 print 函数输出的结果是捕获不到的,解析的结果返回不了给前端,那也没用。喜闻乐见的是,后来无意中发现了 Luerl 这么一个东西。

What's Luerl

Luerl 是一个用纯 Erlang 写的 Lua 解释器,你可以在 Erlang 里执行符合 Lua 语法的表达式和调用其内置的模块函数方法,或者是执行调用一个外部的 Lua 文件。可以说,它纯粹是一个在 Erlang 里实现的 Lua VM。

Luerl 的安装很简单,直接从 github 上载下来,然后到根目录 make 一下就行:

git clone git://github.com/rvirding/luerl.git
make

继续阅读 »

Lua 学习笔记(10) -- 字符串库

Lua 最强大的特性之一就是它的字符串处理能力,它支持字符格式化输出,具有可扩展的模式匹配查找功能,以及一些实用的字符操作,例如查询、截取、替换和删除等字符串操作,这些字符串操作函数都封装在一个名为 string 的模块里。

Lua 里的字符索引是从 1 开始,索引值也可以是负数,这种情况将被解释成向后索引,从字符串末尾开始算起。

下面是 Lua 5.2 提供的字符串操作函数:

byte

函数 string.byte 把字符串里的第 i 个字符转为 ASCII 编码,默认是输出第一个字符的编码(只有一个参数的话),用法:

string.byte (s [, i [, j]])

例子:

print(string.byte("abc"))
print(string.byte("abc", 2))

继续阅读 »

Lua 学习笔记(9) -- Lua 与 C 间的交互

Lua 是一门轻巧、灵活、扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(C/C++)中使用,这主要得益于其提供了功能强大的 C API,这让其跟 C/C++ 间的互调成为一件很轻松的事。

Lua 调用 C

Lua 调用 C 函数,其实就是把 C 函数注册到 Lua 中去,把 C 函数地址传递给 Lua 解释器。这个传递是要遵循一个的协议的,即:

typedef int (*lua_CFunction)(lua_State* L)

Lua 和 C 是通过栈(State)来交互的,Lua 调用 C 函数时,首先 Lua 把数据拷贝到栈上,然后 C 从栈上获取数据,调用结束后将返回结果放到栈中。栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或-1为起始值,因此栈顶索引值永远为-1 ,栈底索引值永远为1 。栈相当于数据在 Lua 和 C 之间的中转站,每一个 C 函数都有自己的独立的私有栈。

继续阅读 »

Lua 学习笔记(8) -- 闭包

之前介绍 Lua 的数据类型时,也提到过,Lua 的函数是一种“第一类值(First-Class Value)”。它可以:

存储在变量或 table (例如模块面向对象的实现)里

t = { p = print }
t.p("just a test!")

作为实参(也称其为“高阶函数(higher-order function)”)传递给其他函数调用

t = {2, 3, 1, 5, 4}
table.sort(t, function(a, b) return (a > b) end)

作为其他函数的返回值

function fun1(x) return fun2(x) end

继续阅读 »

Lua 学习笔记(7) -- 面向对象编程

其实 Lua 中的 table 是一种对象,因为它跟对象一样,有其自己的操作方法:

Role = { hp = 100 }
function Role.addHp(hp)
    Role.hp = Role.hp + hp
end

Role.addHp(50)
print(Role.hp)

上面代码创建了一个名为 Role 对象,并有一个 addHp 的方法,执行 "Role.addHp" 便可调用 addHp 方法。

不过上面对象 Role 是以全局变量的方式创建,会有一种“全局污染”的威胁,即变量 Role 在其他地方被重新赋值(例如被赋成 nil),对象里的属性或方法可能会面临被销毁或不能正常工作的情况。

对于这种问题,Lua 提供一种“接受者”的解决方法,即额外添加一个参数 self 来表示对象本身:

继续阅读 »
返回顶部