lua解析
本lua版本为5.2.1
在lua的源码中,lua.c 实现了可执行的解释器,用于解释执行.out文件,luac.c 实现了字节码的编译器,用于将.lua文件编译为.out文件,即字节码文件。更加宏观的东西,则在打印的两份文档里,此处不详述,由于整个读入解析到解释执行的过程是先从读入.lua文件开始的,所以我这份lua源码解析大业便先从这luac.c文件的阅读学习开始了,以下是它的main程序源代码。
123456789101112131415int (int argc, char* argv[]){ lua_State* L; int i=doargs(argc,argv); argc-=i; argv+=i; if (argc<=0) usage("no input files given"); L=luaL_newstate(); if (L==NULL) fatal("cannot create state: not enough memory"); lua_pushcfunction(L,&pmain); lua_pushinte ...
Coroutine协程
Coroutine Manipulation
coroutine.create (f)
Creates a new coroutine, with body f. f must be a function. Returns this new coroutine, an object with type “thread”.
创建一个新的协程。f必须是一个函数。返回值是这个新的协程,返回值的类型是thread。
coroutine.isyieldable ()
Returns true when the running coroutine can yield.
A running coroutine is yieldable if it is not the main thread and it is not inside a non-yieldable C function.
返回true当正在运行的协程可以被yield。
coroutine.resume (co [, val1, ···])
Starts or continues the execution of coroutine ...
lua学习的查缺补漏
目录
多行注释
取整
长字符串
字符串标准库
lua中安全访问
表
可变长参数
输入和输出
lua运行一段程序
认真学习,增强自己的能力和知识面。
多行注释
1
2
3
4
--[[
fdsa
fdas
]]
取整
为了做到公平性取整,应该做到3.5+0.5为偶数则进位,而2.5+0.5为奇数不进位。
1
2
3
4
5
6
7
8
function round(x)
local f = math.floot(x)
if (x == f) or (x % 2.0 == 0.5) then
return f
else
return math.floor(x + 0.5)
end
end
长字符串
在lua中字符串是常量,一个字符串当被存到内存中的时候就不能再被改变了,所以我们发现如果一个变量引用了一个字符串,我们是不能像CC++那样通过索引进行改变其值的,只能从新赋值新的字符串,这样子其实是这个变量指向了另一块内存了。
1
2
3
4
5
6
local page = [[
fdsaf
fdasf
]]
字符串标准库
...
Lua Iterator
前言由于工作的关系其实我平时写Lua还是很多的,然而一个偶然的机会发现了其实我对Lua的迭代的认识还不够,这里记录一下。
READ THE MANUAL强调一下,一定要看守手册Lua5.1手册
我们来看下Lua中的For
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950The for statement has two forms: one numeric and one generic.The numeric for loop repeats a block of code while a control variable runs through an arithmetic progression. It has the following syntax: stat ::= for Name `=´ exp `,´ exp [`,´ exp] do block endThe block is repeated for name starting ...
lua学习笔记(五)
Lua模块与包模块类似于一个封装库
创建方法:
创建一个table
把需要导出的常量、函数放入其中
返回该table
123456789101112131415161718192021-- 定义一个名为mymodule的模块mymodule={}-- 定义一个常量mymodule.constant="这是一个常量"-- 定义一个函数function () io.write("这是一个公有函数!n")endlocal function func2() print("这是一个私有函数!")endfunction module.func3() func2()endreturn mymodule
require函数12345678910111213-- require函数用于加载模块,使用方法:require("mymodule")require "mymodule"-- 执行require后返回由模块常量或函数组成的table,并且还会定义一个包含该table的全局变量require( ...
lua 元表学习
Lua 中的每个值都有一个元表。table 和 userdata 可以有各自独立的原表,其他类型的值则共享其类型所属的单一元素。Lua 在创建新的 table 的时候不会创建元表。
12t = {}print(getmetatable(t))
可以使用 setmetatable 来修改或设置 table 的元表:
123t1 = {}setmetatable(t,t1)print(getmetatable(t)) --> table: 0x7fc5e9c2f670
例子假设用 table 来表示集合,并且有一些函数来计算集合的交集和并集。
12345678910111213141516171819202122232425262728293031323334353637383940414243Set = {}-- 根据参数列表的值创建新的集合function (t) local set = {} for _,v in ipairs(t) do set[v] = true end return setend-- 集合的并集function Set.unio ...
lua
之前项目中用到 openresty 作为 Web Api 的开发平台, 用 openresty 很适合开发以 http 接口形式
提供的服务. openresty 可以使用 lua 进行逻辑控制,加上完备的组件driver(redis, mysql, rabbitmq 等),
只需要写业务代码将各种数据读取,加工,输出,就是充当胶水的角色.
最重要的一点是, openresty + lua 已经很好的处理并行(开多个 nginx worker即可)和并发(lua coroutine),
lua vm 已经默默的处理了阻塞的IO操作,开发人员可以用写同步代码的方式实现异步.
既然是 Web Api,自然少不了对参数的校验, validator库实现对 lua table 的校验.
把 validator.lua 文件放入 openresty 安装目录的 lualib/resty/ 下即可.
Demo
location /validator_demo {
content_by_lua_block {
local v = re ...
LeetCode 150. Evaluate Reverse Polish Notation
题目描述根据逆波兰表示法(后缀表达式),求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
tag基本计算器题 栈
样例1234567891011121314151617181920212223输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]输出: 22解释: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5= ((10 * (6 / (12 * -11))) + 17) + 5= ((10 * (6 / -132)) + 17) + 5= ((10 * 0) + 17) ...
lua
设计目的其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 特性
轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
其它特性:
支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
Hello World!1print("Hello World!")
交互式编程
123> print("Hello World!")> Hello Wor ...
spark rdd, pipeline, lazyevaluation
一直以来写代码不求甚解,感觉这样不好,从今天开始起读各数据框架的源代码,学习学习再学习
今天看的是pyspark里lazy evaluation的处理,python和scala不同不是函数式的。那这是怎么办到的呢?
首先所有的数据集在spark内部都叫做rdd,这在pyspark里也有定义:
class RDD(object):
<span class="string">""</span>"
A Resilient Distributed Dataset (RDD), the basic abstraction <span class="keyword">in</span> Spark.
Represents <span class="keyword">an</span> immutable, partitioned collection of elements that can be
opera ...