LUA的编译、环境等

Lua命令行

lua命令行选项:

-i:进入交互式

-e:执行lua代码

-l:加载库文件

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

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

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

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

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

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

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

[email protected]:/home/chenqi/studio/test# cat a.lua
#!/usr/bin/lua

print("hello world")

[email protected]:/home/chenqi/studio/test# export LUA_INIT="@a.lua"
[email protected]:/home/chenqi/studio/test# lua
hello world
Lua 5.2.2  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> 

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

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

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

[email protected]:/home/chenqi/studio/test# lua -e "sin=math.sin" test.lua a b
arg[1]=a
arg[2]=b
arg[-1]=sin=math.sin
arg[-3]=lua
arg[-2]=-e
arg[0]=test.lua


环境

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

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

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

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

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

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

一个例子:

local x=0 

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

print(i)  --> nil
print(x)  --> 0

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

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

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

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

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

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

chenqi = 12
local cq = 21

print(_G[‘chenqi‘]) -- 12
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 = 0
f();print(i)        -- 1
f();print(i)        -- 2

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 = 32
local i = 0

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

f()     -- 33
g()     -- 1

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=121}) 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", 2)
    end 

    print(str)
end

foo(12)

输出错误信息:

/usr/local/bin/lua: ./test.lua:13: string expected
stack traceback:
        [C]: in function ‘error‘
        ./test.lua:7: in function ‘foo‘
        ./test.lua:13: in main chunk
        [C]: ?
时间: 2024-10-30 17:00:46

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

Mac下搭建quick cocos2d-x编译环境

前言 虽然之前已经写过了很多 Cocos2d-x 相关的教程和文档,但本次却是我第一次接触 Quick,第一次接触 Lua,所以此次的教程本人将站在一个初学者的角度(看到这里是不是想白眼我了,哈哈,别切啊!尽管第一次,但我身边可是有很多 Quick 大神的,廖大大也在旁边办公室,没准撒个娇大神就把他知道的全部要点倾囊相授了啦!),全方位的解析 Quick 的学习过程,并同大家一起学习如何利用 Quick-Cocos2d-x 开发一款属于自己的游戏,包教包会的哦. 好了,那么下面我们就开始进入正题

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

转自:http://www.58player.com/blog-2537-87218.html 项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行.         下面是使用原生的lua解释器编译字节码:         1.新建一个名为1.lua的文件,里面只有一句话print("Hello Lua"),新建一个空的out.lua脚本文件         2.开始--运行--cmd

用Sublime Text2搭建VC编译环境

用惯了臃肿的VS2013,有时候想写个小项目,小测试程序,编辑浏览代码什么的不想 总打开它,于是我折腾了一下Sublime Text2 这款现代化高大上的强大代码编辑器,它的定位 在于绿色轻巧,速度快,且跨平台支持Win/Mac/Linux,支持32与64位,但它需要配合众多 的插件一起使用,所以比较适合喜欢折腾的人. 另外,Sublime Text2 通常用于前端开发,例如HTML,PHP神马的,亦或者是写些脚本神马的, 像Lua, Js之类的,但估计用它来写VC的还真不多,毕竟有VS这等便利

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

项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行. 下面是使用原生的lua解释器编译字节码: 1.新建一个名为1.lua的文件,里面只有一句话print("Hello Lua"),新建一个空的out.lua脚本文件 2.开始--运行--cmd 3.luac -o out.lua 1.lua 注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径 回车之后,再打开out

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

项目要求lua加密脚本,有关调查的相关信息 ,学习lua自己可以使用luac编译成字节码脚本(bytecode)启用加密,我试了一下.确实是可行. 以下是本机lua编译字节码解释器: 1.创建一个名为1.lua文件,只有一个字print("Hello Lua"),新建一个空的out.lua脚本文件 2.開始--执行--cmd 3.luac -o out.lua 1.lua 注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径,如: 回车之后,再打开out.lua就能够

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

xmake v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmake插件去开发WDK驱动. 下面是xmake支持的一些编辑器插件,用户可以挑选自己喜欢的编辑器配合xmake来使用: xmake-idea xmake-vscode xmake-sublime WDK环境介绍 首先,我们先简单介绍下WDK10的编译环境的安装方式,我们可以看下微软的官方文档:Downl

Lua for Mac环境搭建

1??在Mac上安装Lua的运行环境再简单不过了,如果你的Mac Terminal上安装了Homebrew的话,只需要键入`brew install lua`即可. longsl-mac:~ longsl$ brew install lua Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (homebrew/core). ==> Updated Formulae acpica? ? ? ? ? ? ? erlang?

Firefly-RK3288开发板Android编译环境搭建开荒

入手了Firefly-RK3288的开发板,自己从零开始搭建编译环境开荒 第一步:安装Ubuntu12.04,使用安装盘安装(安装的过程就不详写了,下面贴图) 安装完后,更新ubuntu 第二步:从官网上下载SDK,进行编译环境的安装 下载SDK有两种方式,一是下载压缩包,二是通过git下载. 我选择了下载压缩包.SDK百度云下载地址:http://pan.baidu.com/s/1eQjBGQI?qq-pf-to=pcqq.c2c 在等待代码下载完成的同时,开始按照官方的步骤进行环境安装.为了

cypthon的visual studio编译环境安装

按照教程,如果出现vcvarsall.bat找不到的情况,则需要安装正确版本的visual studio http://docs.cython.org/src/tutorial/cython_tutorial.html python 2.7.x使用的是vs2008,如果没有安装,可以安装vs2008 express版本.下图是查看vs所使用的vs编译器的版本的方法. 可以通过检查环境变量中VS90COMNTOOLS是否存在来确定vs2008 express是否安装好. 下面是配置过程: 先安装v

Sublime Text 3 配置c/c++编译环境(转)

sublime text 3提供了构建功能,它的构建系统(Build systems)可以运行一段外部命令,还可以捕获输出并显示. 要在sublime text 3中实现c或c++代码的编译和运行,在本质上说也是调用外部的命令,windows中也可以理解为执行一段cmd命令. 目前c/c++编译器最流行的就是gcc和g++,本文将从MinGW开始,介绍gcc和g++的基本命令格式,然后详细介绍sublime中自带的编译配置文件,分析每一行的作用.然后给出win7 64bit下 Sublime T