Lua的尾调用和循环
2012-7-20 20:3:2
收藏:0
阅读:123
评论:1
我正在使用Lua编写一个小的CLI模块,以便在C程序中嵌入使用。
我想知道在处理提示选择时最佳方法,应该是使用尾调用还是循环。
如果使用尾调用,我会像下面这样做:
call = { help=function () print 'just ask politely' end }
function shell ()
io.write ('% ')
local cmd = io.read ()
if cmd ~= 'quit' then
call[cmd] () -- 假设call[cmd]的值始终非nil,为了简便
return shell ()
end
end
我想问以下几个问题:
这是正确的使用和实现_tail-call elimination_的吗?
call[cmd]()是否在堆栈中引入了任何干扰,以便我不能利用_tail-call elimination_?是否最好使用如下的循环? 如果是,为什么?
repeat io.write ('% ') local cmd = io.read() -- do stuff until cmd == 'quit'在《Lua程序设计》中有如下说明
一个_tail call_是一个伪装成函数调用的_goto_语句。
所以尾调用和循环之间有任何具体差别吗?
谢谢。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
如果你在问在 Lua 语法中,结尾的
shell调用是否是正确的尾调用,答案是肯定的。函数调用不会修改你所想的方式修该栈。在 Lua 中,尾调用唯一要求的是它应该是
return Function(params)形式的,没有额外的返回值,并且返回的值必须来自函数。一个正确的尾调用甚至不需要调用它自己;它不需要是递归的。
这是一个主观问题。就我个人而言,我认为循环更清晰。
然而,如果你想得出一个关于性能的客观问题,请考虑以下内容:尾调用永远不会_快于_循环。你在性能方面所能得到的最好结果是相等的。
而实际上可能并不会是这样。Lua 的尾调用“优化”仅仅意味着它重新使用当前函数的堆栈条目。Lua 仍然必须从全局表中获取函数。Lua 仍然必须执行调用一个函数的所有开销;它只是不必分配更多的堆栈内存。
这实际上是关于不会溢出堆栈,而且不会在不必要时分配内存的问题。
请参阅上文。