lua函数式编程应用
来源:互联网 发布:软件开发知识库 编辑:程序博客网 时间:2024/06/07 05:07
本来要写个全面一点的 函数式编程文章,不过查了一些资料,发现看不太懂,境界不够,等有时间补上吧。
支持函数编程的语言特点:(以lua为例)
1,函数是第一类值,与其他传统类型具有相同权利。
一,可以存储到变量中,无论是全局变量还是局部变量
例: function haha() print "haha" end local x = haha x() 输出haha
a = print a("hello world") 输出 hello world
二,可以存储到容器中,如table。
例:a = {p = print} a.p("hello world") 输出 hello world
这个非常有用,把一些相似的功能,配置到一个table的配表中,里面可以配置一些数据,与处理的子函数。优点:减少代码的重复,有一种面向对象的思想在里面。
local function callBack1() print("1")end local function callBack2() print("2")endlocal city = {town={level=1,process=80, callBack=callBack1},union={level=2,process=100, callBack=callBack2}}local function cityHandle() for k, v in pairs(city) do --对通用数据的处理 v.callBack() --对不同的地方 调用自己的函数处理 endend
三,可作为参数传递给其他函数。
函数被当作一种数据对象,并且在程序中经常用到匿名函数。代码执行的过程中产生新的函数。我在写C代码的时候经常发现,很多时候我写了好几次似乎重复的代 码,但是由于它们一些细节不一样,没法封装到一个函数中。也许用lamda可以产生更灵活的局部函数。
例:不同的部分写在函数内部的局部函数中,相同的部分写在共同的函数中,最后调用传进去的函数。 从而精简了代码。
第一种:item1Func的局部函数用到的是 itemFunc1中的词法域。也是说用的item1Func1函数中的data 不是commonFunc中的data
local function main() local data = {level="1", item1="2", item2="3"} item1Func(data) item2Func(data)endfunction item1Func(data) local function callBack() print("item1Func "..data.item1) end commonFunc(data, callBack)endfunction item2Func(data) local function callBack() print("item2Func "..data.item2) end commonFunc(data, callBack)endfunction commonFunc(xxx, callBack) print("common "..xxx.level) callBack(xxx)endmain()
local function main() local data = {level="1", item1="2", item2="3"} item1Func(data) item2Func(data)endfunction item1Func(data) local function callBack(xxx) print("item1Func "..xxx.item1) end commonFunc(data, callBack)endfunction item2Func(data) local function callBack(xxx) print("item2Func "..xxx.item2) end commonFunc(data, callBack, 22)endfunction commonFunc(xxx, callBack) print("common "..xxx.level) callBack(xxx)endmain()
四,函数还可作为其他函数的返回值。
这个我暂时没用用上,以后想到哪里用在补上
2,词法域。
一个函数如果嵌套在另一个函数中(写在内部的的函数具有当前父级的词法域。传参数传进去的函数不具有当前函数的词法域,只具有原来父级的词法域),内部的函数可以访问外部函数中的变量。
正确的词法域:
function func() local data = {i=1,j=2} local function fun() print("data.i = "..data.j) end back(fun)endfunction back(callBack) callBack()end子集的子集......也是享受词法域的
function func1() local data = {i=1,j=2} local function fun() print(data.i) local function xx() print(data.j) end xx() endend
错误的词法域:
function func1() local data = {i=1,j=2} local function fun() print("xxx.i = "..xxx.j) end back1(data, fun)endfunction back1(xxx ,callBack) callBack()end
用函数式语言编程就跟做代数题一样,是在做化简。思维方式也与人在做数学题时类似。它的主要思想是将一些复杂的函数吧表达成一些简单函数的复合,如果学过可计算理论,或者递归论,或者拉姆达演算的话,理解起来就很容易了。
函数式语言关心的是一个问题是什么样的小问题的组合(what to do?),命令式语言关心的是怎样解决这个问题(how to do?)。
- lua函数式编程应用
- Lua函数式编程和局部函数详解
- 关于Lua在GUI编程中的应用
- Lua编程(六)C对Lua函数的调用
- 高举Domain Specification,应用函数式编程
- 2. 应用函数式编程原则
- 高举Domain Specification,应用函数式编程
- 第四部分 函数式编程应用
- 第四部分 函数式编程应用
- iOS函数响应式编程应用研究
- iOS中函数式编程和链式编程的应用
- lua的脚本式编程
- lua 应用
- Lua 应用
- Redis编程--Perl接口及内建Lua脚本应用
- MFC lua编程之lua函数作为MFC内部函数调用
- LUA 编程
- lua编程
- 数据结构:图的邻接矩阵存储实现
- C语言 开放寻址法HASH表存储简单实现
- oracle TOPSQL整理
- 探索Javascript异步编程
- XDOJ 简单逆序对
- lua函数式编程应用
- MFC按钮添加提示文字
- 求公约数与公倍数的问题
- 三角形测试用例
- javascript学习十二:面向对象之extends
- Android仿新浪微博ListView效果
- nginx 403 forbidden 二种原因
- 代码总结
- extern用法