programming in lua

一. function

1. 作为表达式或参数时,只有调用是最后一个表达式或参数时才会获得所有结果,其余的只能获得第一个结果(函数没返回值时,第一个结果是nil)

1) 表达式:  ..   = f1(), f2(), f3()

  2) 参数:      F(f1(), f2(), f3())

F( f1() .. f2() .. f3())

获取 f1() 、f2()的第一个结果,f3()的所有结果

2. 构造函数收集表达式的所有参数,

{f1(),f2(),f3()}  构造函数中包含f1, f2的第一个结果,f3的所有结果

3. 使用括号括起来时,始终只获得第一个结果

F((f3()))   只获得f3的第一个结果

4. unpack: 输入是数组,输出是数组中所有元素

unpack{10,20,30}

5. 可变参数

select(‘#‘, ... )   可变参数的个数

select(i, ...)  第i个可变参数

6. function : first value, lexical scope

7. high-order function: contain function argument;

时间: 2024-10-10 16:53:24

programming in lua的相关文章

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

Programming in lua 环境

Lua 用一个名为environment 普通的表来保存所有的全局变量.(更精确的说,Lua在一系列的environment 中保存他的“global”变量,但是我们有时候可以忽略这种多样性)这种结果的优点之一是他简化了Lua 的内部实现,因为对于所有的全局变量没有必要非要有不同的数据结构.另一个(主要的)优点是我们可以像其他表一样操作这个保存全局变量的表.为了简化操作,Lua 将环境本身存储在一个全局变量_G 中,(_G._G 等于_G).例如,下面代码打印在当前环境中所有的全局变量的名字:f

《Programming in Lua 3》读书笔记(二十一)

日期:2014.8.1 PartⅣ The C API 25 An Overview of the C API Lua是一种嵌入式语言.这就意味着Lua不是单独存在的,而是可以通过一系列的标准库将lua的特性嵌入至其他应用模块中. Lua以Lua interpreter(lua的解释器?)来解决了其不是独立程序,我们直到现在却又能独立使用Lua的问题.这个解释器是一个小型的程序(不超过500行代码),使用lua的标准库来实现独立解释程序,这个程序将处理与用户的交互等操作交给lua的标准库,这些库

《Programming in Lua 3》读书笔记(二十五)

日期:2014.8.11 PartⅣ The C API 29 User-Defined Types in C 在之前的例子里,已经介绍过如果通过用C写函数来扩展Lua.在本章,将会介绍通过用C写新的类型来扩展Lua,将会使用到元方法等特性来实现这个功能. 以一个例子来介绍本章将要介绍的,例子实现的功能是实现了一个简单的类型:boolean arrays.实现这个功能主要是这种方法不需要太复杂的算法,因此可以将精力放在API的讨论上.当然我们可以在Lua中用一个table来实现,但是用一个C来实

《Programming in Lua 3》读书笔记(二十六)

日期:2014.8.12 PartⅣ The C API 30 Managing Resources 上一节中实现的自定义类型,我们并没有关注于资源管理的问题.上一节实现的数组是需要关心内存问题,而这些问题由Lua实现管理.但是很多时候事情不那么简单,有些对象不仅需要内存空间,还会需要如窗口句柄.文件描述等资源.尽管说这些也是内存开销,但是这些资源是由系统的其他组件管理的.这种情况下,当一个对象被回收了,我们也需要合适的机制来实现回收这些额外的资源. 在17.6章节中,介绍了Lua提供的fina

《Programming in Lua 3》读书笔记(二十八)

日期:2014.8.15 PartⅣ The C API 32 Memory Management Lua是动态的对其数据结构进行管理的.所有数据结构按需求进行增长,最终进行释放.Lua对其内存的使用控制较为严格,当我们关闭了一个Lua state的时候,Lua会立即释放其内存占用.不仅如此,Lua中的所有对象都被垃圾回收器管理,包括tables,strings,和functions,threads,和modules. Lua进行内存管理的方式对多数程序来说都是挺合适的.但是还是有一些特殊的程序

《Programming in Lua 3》读书笔记(二十七)

日期:2014.8.14 PartⅣ The C API 31 Threads and States Lua实际上是不支持真正的多线程的,即preemptive threads 共享内存的情况.有两个原因:第一个,是ANSI C不支持,所以Lua中就没有合适的方法来实现这个机制:第二个原因,最重要的是作者认为Lua中支持真正的多线程不是个好主意. 多线程是给低级开发语言而发展出的机制.多线程概念中的信号和监控等同步机制机制都是依赖与操作系统而不是依赖于应用程序的,因此很难去发现和修正由多线程造成

《Programming in Lua 3》读书笔记(二十三)

日期:2014.8.7 PartⅣ The C API 27 Calling C from Lua 在这里说Lua调用C函数,并不意味着Lua可以调用任意的C函数.与之前C调用Lua函数一样,在这里同样需要遵循一些规则:传递参数,得到结果.不仅如此,Lua要调用C函数,我们首先需要注册这个函数,即需要将该函数的地址传递给Lua. 当Lua调用C函数的时候,也是使用栈来做参数和返回结果的传递.C函数从栈中得到参数,然后将结果push至栈中. 在这里一个重要的概念是:栈不是一个全局结构:每个函数都有

Programming in lua 杂记(转)

1,loadstring 编译的时候不关心词法范围: local i = 0 f = loadstring("i = i + 1") g = function () i = i + 1 end 这个例子中, 和想象的一样g 使用局部变量i , 然而f 使用全局变量i : loadstring 总是在全局环境中编译他的串. i = 100 local i = 0 f = loadstring("i = i + 1 print(i)") g = function ()

Programming In Lua 第八章

1, 也就是说,lua虽然会把代码预编译成中间码,以提高运行速度.但其会在程序运行过程中需要编译器,所以其仍然是解释型语言.loadfile会加载一个文件并将其编译成中间码,并返回一个函数. 2, 3, f()函数的调用,相当于运行了已经被loadfile函数进行编译的foo.lua代码,也就定义了foo函数.所以后面才能调用foo("ok") 4, 5, 6, 7, 8, 9, 10,