Lua5.1编程一:Lua语言基础

Ubuntu下lua环境的安装(5.1版本) lua的解释器的安装安装lua头文件的位置查看lua版本编写一个C程序测试一下 安装 sudo apt install liblua5.1-0 sudo apt-get install lua5.1-0-dev 不行的话更新一下: sudo gat-get install update lua头文件的位置 ls -al /usr/include/lua5.1 查看lua版本 lua -v 编写一个C程序测试一下 #include <stdio.h> #include &l 阅读详情

Lua的设计目的是依赖C的高效,并提供C所没有动态结构、高层抽象、内存回收、高阶函数等功能。

Lua本身很小,功能有限,大部分功能来源于其标准库。但本身提供的简单、高效、高扩展、可移植等特性,使得在特定场景中Lua有用武之地。

1 语言基础
1.1 词法约定

Lua语言是一种区分大小写的语言。变量命名和C一样,只能使用字母数字和下划线,数字不能位于开始。以下划线开始的变量默认为Lua自己使用的变量。

Lua中有20+个关键字,不能作为变量使用。诸如for while do end之类的。

Lua中的语句最好以;进行分隔。

1.2 注释
-- 这是行注释
--[[ 这是块
     注释
  ]]

1.3 变量
变量不需要声明,无修饰的变量默认为全局变量,变量未初始化时值为nil。如果需要删除一个变量,将其置为nil即可。

系统初始化的全局变量 : _VERSION lua的版本号;_PROMPT  解释器的提示符样式

局部变量使用local来修饰,如local x = 0; 局部变量的作用域只限于声明它们的块。

lua的变量为词法变量,在局部作用域中,局部变量会覆盖全局作用域中的同名变量。

1.4 lua解析器程序

lua代码有几种方式执行:


lua prog.lua args
lua -e "lua code;"
如果传递了脚本参数,则会创建一个名为arg的表,脚本名位于索引0上,其后的参数索引从1开始,其前的参数则位于负数索引上。

2 类型与值

Lua是动态类型语言,类型不在变量名上绑定,而在值中存储。

Lua中有8种基础类型,nil bool number string function thread table userdata。所有的类型均为FirstClass的。type()可以返回一个变量的类型。

number 表示的为双精度浮点数,取值范围大约在1.79e-308,1.79e+308之间,计算时不会出现四舍五入的错误。
string 表示一个字符序列,采用8位编码,可以包含C的转义序列。其为不可修改的值对象。类似于python的doc string 可以将使用[[]]将一大块字符串包含在其中,而避免其中的特殊字符被转义。 #"hello" = 5
   tonumber()  将字符串转换为数
   tostring()      将数字转换为字符串
   ..                     字符串连接符
table  类似于python中的dict,表示关联数组。不仅可用整数来索引,也可用字符串等类型来索引。索引从1开始。
   初始化 t = {1,2,3}; t = {x=1,y=2}; t ={['key']=value, };
   取值   t[1] = 10; t['key'] = value; t.key = value;
userdata 用于存储C语言传递的数据结构。

3 表达式与语法

3.1 运算符

算法运算符  + - * / ^ %
关系运算符  < <= > >= ~= ==
逻辑运算符 and or not

赋值 x=1; x,y = y,x; t[1] = 0;  如果右侧值过少,则多余的变量赋值为nil

3.2 控制结构
Lua不支持switch,if..else结构会比较常见

if a < 0 then
    t = -1;
elseif a = 0 then
    t = 0
else
    t = 1
end

while结构
while i < 10 do
    print(i*2);
    i = i + 1;
end

repeat结构

repeat
    print(2*i);
    i = i + 1;
until
    i < 10;

for结构

for i = 1, 10, 1 do
   print(2*i)
end

泛型for
for k,v in pairs(t) do
    print(k,v)
end

支持break退出当前循环,return用于从当前函数返回。

5 函数

函数调用时需要将参数放在括号中,但如果只有一个参数且参数为字符串或table构造表达式时,可不使用括号。
function foo(str,key)
    local start,end = string.find(string,key);
    return start,end
end

传递参数时和多重赋值类似,如果形参少,则未能赋值的值为nil,多余的参数将丢弃。此外函数可以返回多重值。

unpack可以将数组中的元素解出来,作为多重值返回。

...可以作为变长参考来进行传递和使用。...的行为类似于一个具有多重返回值的函数,返回所有参数。

function add(...)
    local s = 0;
    for i,v in ipairs(...)
        s = s + v
    end
    return s
end

利用table,可以使用键值参数,如
fun(arg)
    return arg.old,arg.new;
end

fun({old="1",new="2"});

6 闭包
Lua支持词法作用域,同时函数又是第一类的。因此可以实现函数式编程的范式。高阶函数可以使用函数处理逻辑。
这样内部定义的函数可以访问外层函数的局部变量。并将外层的变量闭包在自己的对象中。从而可以脱离外层函数来单独调用。

Lua中的模块即使用在了table结合函数指针。
Lib = {}
Lib.fun = function() ... end
Lib.foo = function() ... end

对于递归调用,支持尾递归。但需要实现尾调用。即函数在调用完另一个函数之后,是否无其他事情需要做了。
只有形式上是return <fun>(args); 这样的调用才算是尾调用。只要args在调用前能求出值即可。


7 迭代器与泛型for
和ipairs等价的迭代器
function values(t)
    local i = 0;
    return function() i=i+1 return t[i] end
end

for的实现
for var_1,...,var_n in <explist> do
    <block>
end
--等价于下面的代码
do
    local _func, _state,_var = <explist>
    while true do
        local var1,...,var_n = _func(_state,_var)
        _var = var1
        if _var == nil then
            break
        end
        <block>
    end
end

8 文件加载与错误处理
8.1 加载文件

loadfile只加载文件,但不执行。dofile()则不仅仅会加载而且会执行。loadstring()则加载一段代码的字符串。需要注意的是对于字符串,其在运行时编译时,会在全局变量环境中查找变量。调用会返回一个函数闭包。
function dofile(file)
    local f = assert(loadfile(file))
    f()
end

只有执行了f(),文件中的定义才能生效,接下来才能使用文件中定义的函数等。

8.2 加载C库
Lua提供的底层关于动态链接的功能聚集在package.loadlib函数上。
local f = package.loadlib("/usr/lib/socket.so","luaopen_socket").

通常我们并不需要直接使用它,只需要require("socket")即可。

8.3 错误与异常处理
assert(expr,msg) 当expr表达式为true时返回expr,为假时触发错误,并打印msg信息。
error("msg")     抛出异常并输出msg,error可以返回任何类型的数据,如返回table
pcall(func,fun_args)      以try..catch类似的方式,捕获func调用中出现的error异常,其返回两个参数,第一个参数表示是否出现异常,第二个异常或func返回值。
if pcall (func) then
   <block> --成功执行func
else then
    <block> --异常处理
end

xpcall(func,errHandler)  当出现异常时,在异常现场调用errHandler
debug.traceback()  打印当前的调用栈

9 协同例程(coroutine)
coroutine类似于一个独立的执行线程逻辑,但与线程的区别是,多个coroutine并不是同时执行的,而互相协调,串行执行的。不执行的将让出CPU,以让其他的coroutine来执行。
coroutine.create(func)             创建一个协程,返回协程的id,此时co处于suspended状态
coroutine.resume(co,args)    执行创建的协程,
coroutine.status(co)                返回协程的状态
coroutine.yield(args)               当前运行的协程,通过调用yield挂起自己,使得之前的resume调用可以返回yield传递的参数。只有再次调用resume时,yield()才返回resume调用传 入的参数,使得协程可以向下运行,并交换数据。

运行中协程处于running状态,运行结束则处于dead状态。对于一个死亡状态的协程,调用resume将返回false和一个错误消息。如果协程A在运行中resume了协程B,则A处于normal状态。

示例:使用协程实现生产者和消费者
function producer(consumer)
    while(true) do
        x=io.read("*number");
        send(x,consumer)
    end
end

function filter(consumer)
    while(true) do
        x = receive();
        x = x*x ;
        send(x,consumer)
    end
end

function consumer()
    while(true) do
        x = receive()
        print("In consumer use ",x)
    end
end

function send(x,consumer)
    coroutine.resume(consumer,x)
end

function receive()
    value = coroutine.yield();
    return value;
end

coc = coroutine.create(consumer);
cof = coroutine.create(filter);
cop = coroutine.create(producer);

coroutine.resume(coc)
coroutine.resume(cof,coc);
coroutine.resume(cop,cof)


参考文献

Lua程序设计第二版
Lua Reference 翻译 http://www.photoneray.com/Lua-5.2-Reference-Manual-ZH_CN/


Lua BitOp 提供5.1和5.2版本位操作运算 (跨平台C语言实现 说明部分1) BitOp作为The LuaJIT Project中的一个子项目。 Lua BitOp is a C extension module for Lua 5.1/5.2 which adds bitwise operations on numbers. Features 特点: 支持的位运算符: Supported functions: bit.tobit, bit.tohex, bit.b 阅读详情

相关推荐

位运算和lua中bit模块

一、位运算 与:两个位都为1时,结果才为1 或:两个位都为0时,结果才为0 异或:两个位相同为0,相异为1 取反:1变0,0变1 左移:各二进位全部左移若干位,高位丢弃,低位补零 左移的作用:若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2 右移:各二进位全部右移若干位,正数左补0,负数左补1,右边丢弃 右移的作用:操作数每左移一位,相当于该数乘以2 二、lua中位操作 bit.band() --与 bit.bor() --或 bit.bxor()

nzbing的博客 3259

Lua 5.1参考手册

Lua 5.1参考手册 1 - 介绍 Lua是一种扩展编程语言,旨在支持具有数据描述功能的通用程序编程。它还为面向对象编程,函数式编程和数据驱动编程提供了很好的支持。Lua旨在用作任何需要的程序的功能强大,轻量级的脚本语言。Lua被实现为一个库,用干净的 C语言编写(即,在ANSI C和C ++的公共子集中)。 作为一种扩展语言,Lua没有“主要”程序的概念:它只能嵌入主机客户端

xinqingwuji的博客 2229

跟着 Lua 5.1 官方参考文档学习 Lua (1)

介绍、词法约定、值和类型

alenliu's blog 1892

[Lua语言编程]Lua语言基础知识

文章目录`Lua``Lua`语言的起源`Lua` 特性`Lua下载`Linux 系统上安装Mac OS X 系统上安装Window 系统上安装 `Lua``Lua`语言语法`Lua`标识符`Lua`关键字`Lua`全局变量`Lua`数据类型nil(空)boolean(布尔)number(数字)string(字符串)注意(关于字符串拼接和+):算术运算时的“+”字符串的拼接字符串长度的测量table(表)table的长度function(函数)thread(线程)`userdata`(自定义类型)`Lua`变

hide_in_darkness的博客 2793

Lua 5.1 中lua函数和库函数

PS:仅作记录,自查具体实现 一、基本库函数(basic functions) _G:保存全局环境的全局变量(不是函数)(即_G._G = _G)。Lua本身不使用这个变量;改变它的值不会影响任何环境,反之亦然。(改变环境使用setfenv) _VERSION:保存包含当前解释器版本的字符串的全局变量(不是函数),5.1中这个变量的值是“Lua 5.1”。 assert(v [, mess...

Dream_GentleMan的博客 1473

【COCOS2DX-LUA 脚本开发之二】LUA语言基础

本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi ) 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua1/1235.html           ☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!                 从今天开始,往后将陆续更新Lua教程,主要是搭载Cocos2dx ,

李华明Himi 2万+

Lua5.1 升级 Lua5.3 升级 小结

Lua5.1 升级 Lua5.3 升级 小结 https://www.cnblogs.com/zsb517/p/6822870.html Lua的版本差异确实是比较让人头疼的事情,之前在移动端一直采用Android下使用LuaJit,Ios下使用Lua5.1。这次升级到Xlua(lua5.3版本)主要有两方面的原因:一是ulua后续维护比价差,决定要升级到xlua,另一方面是公司在上线检查中提...

kuangben2000的博客 2240

Lua 5.1中文编程手册:全面指南与实践

本文还有配套的精品资源,点击获取 简介:Lua是一种轻量级脚本语言,常嵌入到应用程序中提供扩展性。本手册是Lua 5.1版本的官方文档中文翻译,涵盖了语法、特性到使用方法的全面指南。内容包括基础语法、数据类型、表、控制结构、函数、模块、元编程、错误处理、C接口、垃圾收集、线程及标准库等关键概念。此外,还包含如何解压和使用手册的说明。手册适用于各级别开发者,并为多个应用领域提...

weixin_35414484的博客 2722

Lua5.1和LuaJIT的区别

Lua5.1和LuaJIT是两个主要Lua实现版本。Lua5.1为标准解释器,而LuaJIT是基于Lua5.1的JIT编译版本,性能显著提升(快5-30倍),并扩展了FFI等功能。LuaJIT优势在于极速执行、优化的内存结构和便捷的C调用接口,但仅兼容Lua5.1特性,不支持新版语法且调试能力受限。Lua5.1适合需要标准兼容性的场景,LuaJIT则适用于高性能需求如服务器开发。选择取决于项目对性能与新特性的需求权衡。

To live, Not survive. 1575

Lua Windows平台脚本编程实践:5.1.4版本入门

Lua是一种轻量级的脚本语言,由巴西里约热内卢天主教大学的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开发。它以其简单的设计、强大的功能和极高的灵活性而闻名。Lua不仅小巧,而且高效,其解释器可嵌入到应用程序中,支持多种编程范式,包括过程式、面向对象、函数式和数据驱动。## Lua的设计哲学Lua的设计哲学非常注重简洁性和可扩展性。

weixin_29009401的博客 948

Orbbec-Gemini-335 深度相机 Python SDK 编译与配置全记录(Windows 环境)

本篇博客将围绕 Windows 系统下 Orbbec SDK 的 Python 配置与编译过程进行详细说明,主要使用的是官方提供的 pyorbbecsdk Python wrapper 项目以及 Orbbec SDK V2 Python Wrapper 配置指南,并记录了安装与配置过程中遇到的若干问题及解决办法。

Junseer的博客 1965

翻译Lua 5.1 VM Instructions(一)

学习Lua的时候看到一篇介绍LuaVM的非常好的文章,读的时候做了些笔记。于是就干脆将它翻译成中文。对于翻译本人是个菜鸟,所以会有很多错误的地方,请包涵。翻译这篇文章并没有得到作者的同意,请不要用于其他用途。 A No-Frills Introduction to Lua 5.1 VM Instructionsby Kein-Hong Man, esq. Version 0.1,

4384

Ubuntu 22.04蓝牙开关秒关?别慌,可能是这个Intel固件文件在搞鬼

本文深入解析Ubuntu 22.04蓝牙开关秒关问题,指出Intel固件文件缺失是常见原因,并提供详细修复方案。通过确认硬件型号、检查固件文件及智能替代方案,帮助用户快速解决蓝牙故障,提升系统稳定性。

weixin_30247307的博客 755

Lua实战笔记第1篇 VS2017编译Lua5.3和Lua5.1

首先登陆Lua官方下载Lua源码包“Lua5.1.5”和“Lua5.3.5” 一、编译Lua5.3     首先在VS2017中创建解决方案   继续创建 C++动态链接库工程“Lua5.3”   解压Lua5.3,将src目录copy至当前工程所在目录,然后将src目录下所有的 .c和.h文件添加至当前工程       更改工程配置属性“C/C++ =&gt; 预编译...

明故宫的记忆 3076

博流BL602开发二 环境搭建与固件烧录实战

本文详细介绍了博流BL602 RISC-V芯片开发环境的搭建与固件烧录全流程。从Linux/WSL系统选择、RISC-V工具链配置、SDK获取,到编译首个Wi-Fi示例并生成固件镜像,再到通过命令行或图形化工具完成烧录及串口测试,提供了完整的实战指南和常见问题解决方案。

weixin_29175469的博客 449

图像质量评估(5) -- 畸变(Distortion)

当图像中原本应该是直线的地方看起来发生了不自然的变形或扭曲时,我们称为图像畸变。有三种类型的镜头畸变:桶形畸变(后文使用英文barrel),枕形畸变(后文使用pincushion)和胡子畸变(后文使用英文wavef或mustache,这种畸变里包含了桶形畸变和枕形畸变)。有一个重要的点需要注意,根据透镜的类型以及透镜是否能够从相机中移除等条件不同,畸变会有不同的表现。 总的来说,旋转对称光学系统功能上会产生和物体几何相似的图形。但也有少数特殊的系统是例外,例如鱼眼镜头,这种镜头几何是故意设计为

vivo01的专栏 2万+

Lua 5.1 参考手册

Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingnow.com Copyright © 2006 Lua.org, PUC-Rio. All rights reserved. 1 - 介绍 Lua 是一个扩展式程序设计语言,...

weixin_30758821的博客 443

Vivado报错-4 [Routed 35-3424] SLL Assignment failed ILP VU19P

Vivado报错[Routed 35-3424] SLL Assignment failed ILP VU19P

weixin_39896700的博客 1408

LuaDist/lua 项目解析:Lua 5.1 语言参考手册深度解读

Lua 是一种轻量级的扩展脚本语言,设计初衷是支持通用过程式编程并提供数据描述功能。它具有以下核心特性: - 多范式支持:面向对象、函数式、数据驱动编程 - 嵌入式设计:作为库实现,需要宿主程序调用 - 跨平台性:使用标准C编写(ANSI C和C++的公共子集) - 动态类型:变量无类型,值携带类型信息 - 开源自由:遵循自由软件许可协议 典型应用场景包括: - 游戏脚本开发 - 应用程序扩展...

gitblog_00707的博客 875

TC3XX - MCAL知识点(二十七):SENT Mcal配置及代码实战(单边半字节传输协议)

SENT协议只有一根线,异步传输!Sent协议的全称为Single Edge Nibble Trans .isson,单边半字节传输协议,是一种单线异步串行通信协议。Sent报文包含8个Nibble和一个校准位如图1所示,每一个Nibble数据被编码成PWM方式。设计这种协议的目的是用在与汽车ECU快速交互信息的传感器上,以此来取代低精确度的10bit AD和PWM。Sent是一种点对点的单方向从传感器到控制端的协议,控制器不需要同步信号。

梦想技术家 2271

基于Python的FTA协定内容爬虫实战:从数据抓取到智能分析

本文将详细介绍如何使用Python构建一个高效的FTA(自由贸易协定)内容爬虫,涵盖最新技术如Playwright、异步IO、智能解析等。通过本教程,您将学会如何从各类政府网站和国际组织平台抓取结构化FTA数据,并对其进行清洗、存储和分析。文章包含完整的代码实现和最佳实践指南,适合中高级Python开发者学习网络爬虫开发。

2201_76125261的博客 992

【lua语言基础(一)】lua语言入门

lua编程, 基础入门

杭电码农-NEO的博客 1120

AUTOSAR NvM 实车故障深度剖析:车载存储问题快速定位与工程解决方案

软件配置与代码逻辑无问题时,排查底层驱动与ECU硬件,步骤如下:底层驱动排查:排查Fls/Eep驱动配置,是否适配目标MCU(如TC397、S32K),编程/擦除/读取时序是否合理;检查Fls/Eep驱动错误处理逻辑,是否未处理Flash编程失败、读取错误等异常;验证Flash高速编程模式是否启用,是否能提升写入/读取速度;排查MemIf层配置,是否正确对接NvM与Fls/Eep驱动,是否存在调度延迟。

getusushu的博客 78

SciTE配置及如何将SciTE编译环境从lua5.1升级

我是Last炫啊后面还有个、你龙哥的好闺蜜阿梓啊,最近想学lua,刚从菜鸟教程上看了教程下了编译器就出问题了,一直粘着你龙哥要我教她啊,你龙哥啊,就出个教学,顺便教教你们这些粘够使啊。

EdwardWine的博客 1723

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Lua语言基础

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

weixin_41924879的博客 1475

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 使用SSH进行端口转发
下一篇: Lua5.1编程二:Lua高级特性
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值