Lua的环境、编译等

Lua命令行

lua命令行选项:

-i:进入交互式

-e:执行lua代码

-l:加载库文件

例如使用下面的命令启动lua解释器,可以重新定义lua提示符。

lua -i -e "_PROMPT=' try>'"

在交互模式下,如果要打印任何表达式的值,可以用等号开头,并跟随一个表达式,例如:

> a="hello" .. "world"
> =a
helloworld
> =math.sin()
-0.80115263573383
>

lua解释器执行其参数前,会先查找一个名为LUA_INIT的环境变量:

如果找到这个变量,并且其内容为“@filename”,那么解释器会先执行这个文件; 如果LUA_INIT不是以@开头,则作为Lua代码执行。

如下面的示例,将LUA_INIT定义为"@a.lua",然后启动lua解释器,自动加载了a.lua文件。

root@chenqi-PC:/home/chenqi/studio/test# cat a.lua
#!/usr/bin/lua print("hello world") root@chenqi-PC:/home/chenqi/studio/test# export LUA_INIT="@a.lua"
root@chenqi-PC:/home/chenqi/studio/test# lua
hello world
Lua 5.2. Copyright (C) - Lua.org, PUC-Rio
>

解释器在运行脚本前,会用所有的命令行参数创建一个名为arg的table,例如test.lua源文件内容如下,

for i,v in pairs(arg) do
print(string.format("arg[%d]=%s", i,v))
end

执行后,打印出所有的参数:

root@chenqi-PC:/home/chenqi/studio/test# lua -e "sin=math.sin" test.lua a b
arg[]=a
arg[]=b
arg[-]=sin=math.sin
arg[-]=lua
arg[-]=-e
arg[]=test.lua

环境

Lua执行的每段代码,例如一个源文件,或在交互模式中输入的一行代码,都称为一个chunk。

一个chunk可以简单到只包含一条语句,也可以由若干条不同的语句及函数定义构成。

Lua中定义的变量默认都是全局变量,要删除一个全局变量,只需将其赋值为nil。

a=
print(a) --> 10
a=nil
print(a) --> nil

可以使用关键字local声明局部变量,局部变量的作用域仅限于声明它们的那个block,

一个block可以是一个控制结构的执行体,或者是一个函数的执行体,或者是一个chunk。

一个例子:

local x= 

for i=, do
local x=i+
print(x) --> 2,3,4,5
end print(i) --> nil
print(x) --> 0

刚才提到,在交互模式下,每一行代码都是一个chunk,例如:

> a=
> =a > local b=
> =b
nil
>

上面的例子中,局部变量b在下一行代码(一个新的chunk)中就消失了。

注意:local同样也可以用来修饰函数,从而定义一个局部函数。

lua中应该尽可能使用局部变量,可以避免将一些无用的名称引入全局环境(global environment);

此外,访问局部变量比访问全局变量更快,Lua的全局变量是放在一个table中的,即_G,例如:

chenqi =
local cq = print(_G['chenqi']) --
print(_G['cq']) -- nil

最后,一个局部变量通常会随着作用域的结束而消失,这样垃圾收集器可以及时释放内存。

在lua中,有一种习惯的写法是:

local foo=foo

这句代码的意义是创建局部变量foo,并用全局变量foo的值对它初始化,如果后续其它函数改变了全局foo的值,那么这里可以先将它的值保存起来。

这种写法的另一个作用就是加速在当前作用域中对foo的访问。

全局变量

访问具有动态名字的全局变量:

_G['company'] = {name='sina' }

function getfield(f)
local v = _G
for w in string.gmatch(f, "[%w_]+") do
v = v[w]
end
return v
end print(_G['company.name']) -- nil
print(getfield('company.name')) -- sina

编译

loadfile

local func = loadfile("mode_name")

func()

loadfile 函数会将代码编译成中间码,并且将编译后的chunk作为一个函数返回,而不执行代码。

另外,loadfile不会抛出错误信息,而是返回错误码。

loadstring

loadstring 函数与loadfile类似,不过它不是从文件里读入chunk,而是从一个字符串中读入,例如:

f = loadstring("i=i+1")

i =
f();print(i) --
f();print(i) --

Lua把每一个chunk都作为一个匿名函数处理,并且该匿名函数还具有可变长实参。例如:

loadstring("a=1")返回的结果等价于表达式:function(...) a=1 end

loadfile和loadstring都是编译代码,然后将编译结果作为一个函数返回。
loadfile和loadstring都不会引发错误,只是返回nil和错误消息:

print(loadstring("i i "))
-- nil [string "i i "]:1: '=' expected near 'i'

loadstring总是在全局环境中编译它的字符串,如下面的例子中,函数g操作了局部的i,函数f操作的却是全局的i。

i =
local i = f = loadstring("i=i+1; print(i)")
g = function() i=i+; print(i) end f() --
g() --

loadstring常用于执行外部代码,例如:

print "enter your expression: "
local l = io.read()
local func = assert(loadstring("return " .. l))
print("result is: " .. func())

dofile

dofile("model_name.lua")

dofile 函数读入文件、编译,然后执行,它实际上是对loadfile的封装:

function dofile(filename)

    local f = assert(loadfile(filename))

    return f()

end

动态链接

Lua支持加载动态链接库,如下

local path = "/usr/local/lib/lua/5.1/socket.so"
local f = package.loadlib(path, "luaopen_socket")

如果在加载库时发生错误,loadlib返回nil及一条错误消息。

loadlib是一个非常底层的函数,必须提供库的完整路径及正确的函数名。通常使用require来加载C程序块,这个函数库会搜索指定的库,然后用loadlib来加载库,并返回初始化函数,这个初始化函数应将库中提供的函数注册到Lua中。

require

require("model_name")

require 函数载入model_name.lua文件,载入的同时直接执行该文件,注意:只有第一次载入的时候会去执行。

与dofile不同的是,require提供了2个功能:

1、搜索目录加载文件;

2、判断文件是否已加载,避免重复加载。

指定搜索lua模块的路径:

package.path = '/usr/local/share/lua/5.1/?.lua;/home/resty/?.lua;'

指定搜索so模块的路径:

package.cpath = '/usr/local/lib/lua/5.1/?.so;'


错误与异常处理

Lua所遇到的任何未预期条件都会引发一个错误。例如,当试图将两个非数字的值相加、索引一个不是table的值,等。
Lua也可以通过调用error函数显式地引发一个错误,例如:

local n = 'a'
if not n then error("invalid n") end n = nil
assert(n, "invalid n")

assert函数的作用是判断第一个参数是否true,如果不是则自动调用error函数引发错误。

error用来抛出异常,而捕获异常需要使用pcall函数。

pcall函数以一种“保护模式”来调用它的第一个参数,因此pcall可以捕获函数执行中的任何错误。
如果没有发生错误,pcall会返回true及函数调用的返回值;否则,返回false及错误消息。

local status, err = pcall(function() error({code=}) end)
print(status, err.code)  -- false 121 local status, ret = pcall(function() return 'ok' end)
print(status, ret)     -- true ok

注意:这里error函数的参数可以是任意类型,而不仅仅是字符串。

error函数的第一个参数用于表达错误消息,事实上,它还有第二个参数,用于指出应由调用层级中的哪个层(level)来报告当前的错误,也就是说明谁应该为错误负责。

function foo(str)
if type ~= "string" then
error("string expected", )
end print(str)
end foo()

输出错误信息:

/usr/local/bin/lua: ./test.lua:: string expected
stack traceback:
[C]: in function 'error'
./test.lua:: in function 'foo'
./test.lua:: in main chunk
[C]: ?

LUA的编译、环境等的更多相关文章

  1. 【转载】cocos2d-x教程 Mac系统下搭建Lua的编码环境

    原文链接:http://blog.csdn.net/u012945598/article/details/17168831   在使用Lua写脚本的时候大家都会因为没有代码提示导致敲代码的效率有所下降 ...

  2. <1>lua编译环境 数据类型和局部变量

    1.编译环境 http://www.lua.org/download.html下载 解压后 bin目录中lua.exe运行   luac.exe编译成lua字节码 2.基本数据类型 整数,小数,布尔值 ...

  3. Sublime Text 3(中文)添加Lua编译环境

    Sublime Text 3(中文)添加Lua编译环境 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 没有 ...

  4. Cocos2d-x使用Luajit将Lua脚本编译成bytecode,启用加密

    http://www.cocoachina.com/bbs/read.php?tid=205802 lua脚本进行加密,查了一下相关的资料 ,得知lua本身能够使用luac将脚本编译为字节码(byte ...

  5. Mac在结构quick cocos2d-x编译环境

    关于 Quick 很多其它的使用说明可參考安装文件夹下的 README 文件. Quick-Coco2d-x开发工具 普通情况下,我们通常都会採用Cocos Code IDE作为开发工具来高速开发游戏 ...

  6. ubuntu 14.04 安装torch及编译环境zbstudio

    ubuntu 14.04 安装torch及编译环境zbstudio torch zbstudio 本来是安装官网给的步骤安装torch的,可是碰到一系列的问题,后来参考网上的安装方法安装成功了 官网安 ...

  7. 安装Nginx+Lua+OpenResty开发环境配置全过程实例

    安装Nginx+Lua+OpenResty开发环境配置全过程实例 OpenResty由Nginx核心加很多第三方模块组成,默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用. ...

  8. Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密

    转自:http://www.58player.com/blog-2537-87218.html 项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(b ...

  9. Cocos2d-x使用Luajit将Lua脚本编译为bytecode,实现加密 更新

    项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身能够使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行. 以下是使用原生的lua解释器编译字节码: 1 ...

  10. xmake新增对WDK驱动编译环境支持

    xmake v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmak ...

随机推荐

  1. C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

    既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞 ...

  2. WCF4.0 –- RESTful WCF Services (1) (入门)

    WCF 很好的支持了 REST 的开发, 而 RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持 HTTP 请求,无需去实现复 ...

  3. 浩瀚先森(guohao1206.com)

    博客搬家啦,新博客地址:浩瀚先森 http://www.guohao1206.com

  4. cocos2d-x 3.6 mac下的试用(粒子,触摸事件,图片)

    戏说 虽然公司再如何如何,咱程序员在干好课外学习的情况下也是要努力做好本职工作的. 工作中的lua也写多了,深入了解Cocos2d-x当然还是要倒腾倒腾C++,对于一个C#用了这么多年,工作用lua的 ...

  5. c++实现简单计算器

    帮一个同学写的,非计算机类专业,应付交差,也没什么功能,两个数的加减乘除运算,以及三角函数的运算.要求用到模板.运算符重载和异常处理. 一直以来都是用的java,没怎么用过c++,就当是复习了一下c+ ...

  6. 教你用netstat-实践案例

    netstat命令的功能是显示网络连接.路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作. 该命令的一般格式为: netstat [选项] 命令中各选项的含义如下: -a 显示所有so ...

  7. 初探JAVA中I/O流(一)

    一.流 流,这里是对数据交换的形象称法.进程是运行在内存中的,在运行的过程中避免不了会与外界进行数据交互.比如将数据从硬盘.控制台.管道甚至是套接字(具体点应该是我们电脑上的网卡)读到我们进程锁所占据 ...

  8. Moqui学习Day4

    添加一个新建表单 添加一个按钮来弹出新建表单,并创建一个转换来处理输入数据操作. 在FindTutorial.xml文件中添加一个转换. <!--新增 列表 --> <transit ...

  9. linux 安装webbench

    webbench :1.5  http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz从官网下载webbench-1.5.tar.gz1.解压 t ...

  10. 为HTML添加图片登录按钮

    来源于:http://www.2cto.com/kf/201510/447673.html <!DOCTYPE html> <html> <head lang=" ...