从C 调用Lua函数是相当简单的,但有没有办法将 Lua函数存储在某个地方供以后使用?我想存储传递给我的C函数的用户定义的Lua函数以用于事件,类似于connect函数在wxLua中的工作方式.
关于Continuation的维基百科文章说:
"在任何支持闭包的语言中,都可以用连续传递方式编写程序并手动实现call/cc."
这是真的,我需要知道如何做或不是真的,这个陈述需要纠正.
如果这是真的,请告诉我如何在Lua中实现call/cc,因为我看不清楚如何.
我想我能够实现来电/立方厘米,如果手动Lua中有coroutine.clone功能解释在这里.
如果闭包不足以实现call/cc那么还需要什么呢?
以下文字是可选阅读.
PS:Lua与其协程表一次性延续.一个coroutine.clone函数允许我克隆它多次调用它,从而有效地使call/cc成为可能(除非我误解了call/cc).但是Lua中不存在克隆功能.Lua IRC频道上的某个人建议我使用Pluto库(它实现序列化)来编组协程,复制它然后解组它并再次使用它.虽然这可能会奏效,但我更感兴趣的是call/cc的理论实现,以及查找语言需要具有的实际最小特征集以便允许其手动实现.
编辑1:好的人,帮我在这里,这花了我很长时间,因为我不知道任何计划,但我想出了一些应该帮助我们的东西.请看下面的代码.第一个是Scheme中的程序,第二个是相同的程序,但在Lua中.
希望这会帮助我们.我相信我们非常接近.
PS:这些例子来自关于CallCC的维基百科文章的第一个例子.
方案版
(define call/cc call-with-current-continuation)
; callcc CPS-transformed (thanks to the people from the #scheme channel at freenode.net)
(define cpscallcc
(lambda (consumer k)
(let ((cc (lambda (result) (k result))))
(consumer cc k))))
; this is the continuation we will use to display the "returned" values
(define main-continuation
(lambda (result)
(display "--> ")
(display result)
(newline)))
; …Run Code Online (Sandbox Code Playgroud) 在python中,通常会定义一个main函数,以便允许脚本用作模块(如果需要):
def main():
print("Hello world")
return 0
if __name__ == "__main__":
sys.exit(main())
Run Code Online (Sandbox Code Playgroud)
在Lua中,这样的成语if __name__ == "__main__"是不可能的(这意味着,我认为不是这样).
这就是我为了在Lua中有类似行为而通常所做的事情:
os.exit((function(args)
print("Hello world")
return 0
end)(arg))
Run Code Online (Sandbox Code Playgroud)
......但这种方法似乎相当"重要的括号":-)
是否有更常见的方法(除了定义一个看似多余的全局主函数)?
我有一个工作的C++函数,我可以从Lua调用.为了证明我的问题,这里有一个例子:
int PushHello(lua_State *L){
string str("Hello");
lua_pushlstring(L, str.data(), str.length());
return 1;
}
Run Code Online (Sandbox Code Playgroud)
注意:我知道我不必在那里使用字符串变量,但它是为了证明这个问题.
这是我的两个问题:
当我从Lua字符串构造函数调用此函数时可能会抛出异常.那是问题吗?Lua会处理它并正确解开Lua堆栈吗?我不这么认为.我怎么解决这个问题?我是否需要添加try/catch所有此类代码并将异常转换为lua_error?是不是有更好的解决方案?
我可能通过将Lua编译为C++来解决的另一个问题是,如果使用longjmp,则lua_pushlstring()调用lua_error()字符串析构函数时不会调用它.通过编译为C++并抛出异常而不是使用longjmp来解决问题吗?
为了澄清,我可以看到问题1的可能解决方案是:
int PushHello(lua_State *L){
string str;
try{
str.assign("Hello");
catch(exception &e){
luaL_error(L, e.what());
}
lua_pushlstring(L, str.data(), str.length());
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但这非常难看并且容易出错,因为try/catch需要添加到许多地方.它可以作为一个宏来完成并放置每个可以抛出的命令,但这不会更好.
我想知道在Lua中是否存在使用分号的一般惯例,如果是,我应该在哪里/为什么使用它们?我来自编程背景,因此用分号结束语句似乎直观正确.然而,我担心为什么它们"optional"在其普遍接受的分号结束其他编程语言的语句时.也许有一些好处?
例如:从lua编程指南中,这些都是可接受的,等效的,语法准确的:
a = 1
b = a*2
a = 1;
b = a*2;
a = 1 ; b = a*2
a = 1 b = a*2 -- ugly, but valid
Run Code Online (Sandbox Code Playgroud)
作者还提到: Usually, I use semicolons only to separate two or more statements written in the same line, but this is just a convention.
这是否被Lua社区普遍接受,还是有其他方式被大多数人所青睐?或者它是否像我个人的偏好一样简单?
我只是有一个普遍的问题.
在Lua中使用单引号和双引号有什么区别吗?
例:
require('test.lua')
require("test.lua")
Run Code Online (Sandbox Code Playgroud)
当我在PAWN中编程,一种类似于C的语言时,单引号可用于字符,但不能用于文本字符串,您必须为它们使用双引号.
如果没有差异,建议使用哪一个?
这个问题很可能已经得到了解答,但是我找不到已回答的话题.
谢谢.
在文档中似乎没有明确的答案.
我有兴趣增加一个time计算程序启动后秒数的变量.如果最大值可以计入未来,例如100年,那么我不关心让变量永远增量.否则我将不得不考虑重置time为0 的好点.
我正在用C++编写一个游戏引擎,它也支持Lua.
我最大的恐怖:内存泄漏.
这并不像我的游戏已经被它们所侵扰,我很害怕它们像蘑菇一样从地面冒出来,当开发处于后期并且项目庞大而复杂时.
我很害怕他们,因为他们似乎很难找到我.尤其是在复杂系统中.如果我的引擎差不多完成,游戏就会运行,内存就会消失,我该怎么办?我将从哪里开始搜索?
我需要使用Windows命令行(cmd)执行.lua脚本.我的.lua文件在我的lua.exe所在的文件夹中.
我已经尝试了几种运行文件的方法,但我无法弄清楚如何做到这一点.=(
(我也有扩展名.out的相同脚本)
lua ×10
c++ ×2
c ×1
callcc ×1
cmd ×1
conventions ×1
exception ×1
executable ×1
function ×1
memory-leaks ×1
numbers ×1
time ×1