1. 脚本参数可以通过arg得到、它会建立arg表
2. -i进入交互模式、-e直接执行 -l加载动态库
3. 习惯命名 1)驼峰 2)属性+类型+名称 
4. lua的数据类型
  简单类型: 1)空值  2)布尔 3)数字 直接存放值
  引用类型:4)字符串 5)函数 6)自定义类型 7)线程 会存放变量和值地址
5. lua使用double类型来表示number类型的值、所以不会存在四舍五入的精度丢失
6. print(#a) 打印字符串a的长度
7. #a 和 getn(a) 等价、遇到nil结束  maxn遍历所有元素、遇到nil继续
8. 对于引用型比较、只有引用同一对象时、lua才认为是相等
   eg. a = {}; a.x=1; a.y=1;
       b = {}; b.x=1; b.y=1;
       a ~= b 因为a和b引用的不是同一个对象
9. 字符串连接 .
   table构造表达式 {}
10. 全局变量会写入全局表 _G
11. 第一类值:把可以存放在变量、可以作为函数参数、也可以作为函数返回值的类型(boolean/number)等
             称为第一类值、在lua里、函数是第一类值
    第二类值:把不可以存放在变量、不可以作为函数参数的值作为第二类值、也不可以作为函数返回值的值
12. 一个函数是另一个函数的最后一个动作时、称为尾调用
     它相当于goto语句直接跳转到对应的执行地址执行、不需要保存堆栈信息
13. lua调试:pcall、xpcall、debug
14. 协程:跟线程一样代表一个执行序列、执行序列的先后顺序不是CPU隐藏的进行、而是程序显式控制
    线程:每个线程代表一个执行序列、在一个时间片内执行哪个线程是不确定的、我们可以确定线程的优先级、实际的线程调度是CPU控制的
15. 协程状态:create->resume->running->dead
     supended 协程还未结束、自身调用了yied暂停执行

     coroutine.resume(co[, val1, ...]);
     resume: 首次启动协程coroutine时、val1会传递给协程co的函数
             再次执行时、参数val1会作为给协程co中上一次yield的返回值

    1)co函数执行完毕、正常终止、resume返回true和函数的返回值
    2)执行中正常暂停执行yield、resume返回true和调用yield传入的参数
    3)在执行中发生错误、返回false与错误信息、它是在保护模式下执行的、不会导致程序崩溃

    coroutine.yield 会使正在执行的函数挂起、传递给yield的参数会作为resume的额外返回值
16. lua_State 其实就是lua的一种变量类型、线程类型、保存了线程在执行过程中需要的堆栈信息
17. TValueFields里边、tt用来存储变量类型  value是union、如果是引用类型、存gc 整型存
18. tstring解决hash冲突是通过链地址法、hash表解决hash冲突是通过开放地址法

luaL_pushresult
luaL_pushvalue