标签: lua

存储Lua功能?

从C 调用Lua函数是相当简单的,但有没有办法将 Lua函数存储在某个地方供以后使用?我想存储传递给我的C函数的用户定义的Lua函数以用于事件,类似于connect函数在wxLua中的工作方式.

c lua function

22
推荐指数
2
解决办法
6423
查看次数

呼叫/ cc在Lua - 可能吗?

关于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)

continuations lua callcc

22
推荐指数
3
解决办法
3832
查看次数

Lua的"主要"功能?

在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)

......但这种方法似乎相当"重要的括号":-)

是否有更常见的方法(除了定义一个看似多余的全局主函数)?

lua

22
推荐指数
3
解决办法
1万
查看次数

从Lua调用函数时如何处理C++异常?

我有一个工作的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)

注意:我知道我不必在那里使用字符串变量,但它是为了证明这个问题.

这是我的两个问题:

  1. 当我从Lua字符串构造函数调用此函数时可能会抛出异常.那是问题吗?Lua会处理它并正确解开Lua堆栈吗?我不这么认为.我怎么解决这个问题?我是否需要添加try/catch所有此类代码并将异常转换为lua_error?是不是有更好的解决方案?

  2. 我可能通过将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需要添加到许多地方.它可以作为一个宏来完成并放置每个可以抛出的命令,但这不会更好.

c++ lua exception

22
推荐指数
1
解决办法
6315
查看次数

Lua Semicolon公约

我想知道在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 conventions

22
推荐指数
1
解决办法
2万
查看次数

Lua中'和'之间的区别

我只是有一个普遍的问题.

在Lua中使用单引号和双引号有什么区别吗?

例:

require('test.lua')
require("test.lua")
Run Code Online (Sandbox Code Playgroud)

当我在PAWN中编程,一种类似于C的语言时,单引号可用于字符,但不能用于文本字符串,您必须为它们使用双引号.

如果没有差异,建议使用哪一个?

这个问题很可能已经得到了解答,但是我找不到已回答的话题.

谢谢.

lua

22
推荐指数
2
解决办法
9728
查看次数

Lua中一个数字的最大值是多少?

在文档中似乎没有明确的答案.

我有兴趣增加一个time计算程序启动后秒数的变量.如果最大值可以计入未来,例如100年,那么我不关心让变量永远增量.否则我将不得不考虑重置time为0 的好点.

time lua numbers

21
推荐指数
2
解决办法
3万
查看次数

如何使用Lua运行可执行文件?

我有一个可执行文件我想用Lua运行...我该怎么做?

似乎无法找到任何关于此的文档.

lua executable

21
推荐指数
4
解决办法
3万
查看次数

内存泄漏 - 每个程序员的恐怖?

我正在用C++编写一个游戏引擎,它也支持Lua.

我最大的恐怖:内存泄漏.

这并不像我的游戏已经被它们所侵扰,我很害怕它们像蘑菇一样从地面冒出来,当开发处于后期并且项目庞大而复杂时.

我很害怕他们,因为他们似乎很难找到我.尤其是在复杂系统中.如果我的引擎差不多完成,游戏就会运行,内存就会消失,我该怎么办?我将从哪里开始搜索?

  • 我对内存泄漏的恐惧是否合理?
  • 如何找出内存泄漏的位置?
  • 是不是有很好的工具可以帮助找到今天的内存泄漏源?

c++ lua memory-leaks

21
推荐指数
6
解决办法
3159
查看次数

如何运行.lua脚本?

我需要使用Windows命令行(cmd)执行.lua脚本.我的.lua文件在我的lua.exe所在的文件夹中.

我已经尝试了几种运行文件的方法,但我无法弄清楚如何做到这一点.=(

(我也有扩展名.out的相同脚本)

lua cmd

21
推荐指数
1
解决办法
5万
查看次数