【问题标题】:Lambda Expressions and Script Parsing -- Is this a good design idea?Lambda 表达式和脚本解析——这是一个好的设计理念吗?
【发布时间】:2010-12-02 12:27:56
【问题描述】:

我已经编写了一些基本的 2D 射击游戏,就它们而言,它们运行良好。为了建立我的编程知识,我决定使用一种简单的脚本语言来扩展我的游戏来控制一些对象。目的更多是关于编写脚本解析器/执行器的一般设计过程,而不是对随机对象的实际控制。

所以,我目前的想法是使用 lambda 表达式的容器(可能是映射)。当解析器读取每一行时,它将确定表达式的类型。然后,一旦它决定了指令的类型并发现了它必须使用的任何值,它就会打开映射到该表达式的类型,并将它需要工作的任何值传递给它。

一个或多或少的伪代码示例如下:

//We have determined somehow or another that this is an assignment operator
someContainerOfFunctions["assignment"](whatever_variable_we_want);

那么,你们觉得这样的设计怎么样?

【问题讨论】:

    标签: c++ scripting lambda c++11


    【解决方案1】:

    并不是要劝阻您,但我认为您可以从将 Squirrel 或 Lua 之类的东西嵌入到您的项目中并学习使用 API 和语言本身中获得更多收益。这样做的好处是您无需考虑实现即可获得良好的性能。

    从头开始实施脚本语言(甚至是基本的)是一项艰巨的任务,尤其是当您以前没有做过的时候。

    【讨论】:

    • 松鼠+1;它很棒而且快速。除非 OP 想要体验诞生一门新语言,否则我会说这是要走的路。
    • 这些都是很好的建议(我对 Lua 有一些经验),但是这个练习的目的确实是为了体验实现脚本语言的痛苦和痛苦。我希望这将是一个很好的思考练习。
    • Lua 是一种很棒的脚本语言。如果您了解 C,它非常灵活、快速、轻量且易于使用。只需查看用 Lua 编写的游戏列表:en.wikipedia.org/wiki/Category:Lua-scripted_video_games
    • @ZachS 是的,唯一的问题是,我以前去过那里。我承认,让基础知识开始很有趣,但最终我什至没有进入字节码执行阶段,这很糟糕。
    • 如果你仍然对嵌入式脚本语言感兴趣,我建议你看看lua.org/doc/jucs05.pdf
    【解决方案2】:

    说实话:我认为这不是你描述的好主意,但确实有潜力。

    这限制了 C++ 的静态参数数量的“烦人”负担,这可能是也可能不是你想要的语言。

    想象一下——你想代表一个函数:

    VM::allFunctions["functionName"](variable1);
    

    但是那个函数有两个参数!我们如何定义一个动态参数函数?使用“...” - 表示stdargs.hva_list。不幸的是,va_list 有缺点 - 你必须提供一个额外的变量,它会以某种方式告诉你有多少变量,所以我们将虚构的函数调用更改为:

    VM::allFunctions["functionName"](1, variable1);
    VM::allFunctions["functionWithtwoArgs"](2, variable1, variable2);
    

    这给您带来了一个新问题 - 在运行时,无法传递多个参数!所以我们必须将这些参数组合成可以在运行时定义和使用的东西,让我们(假设地)将它定义为

    typedef std::vector<Variable* > VariableList;
    

    我们现在的电话是:

    VM::allFunctions["functionName"](varList);
    VM::allFunctions["functionWithtwoArgs"](varList);
    

    现在我们进入“作用域”——没有作用域就不能“执行”一个函数——尤其是在嵌入式脚本语言中,你可以拥有几个虚拟机(沙盒等),所以我们必须有一个Scope 类型,这会将假设的调用更改为:

    currentVM->allFunctions["functionName_twoArgs"].call(varList, currentVM->currentScope);
    

    我可以继续说下去,但我想你明白我的回答的重点 - C++ 不喜欢动态语言,它很可能不会改变以适应它,因为它很可能也会改变 ABI .

    希望这会带你走向正确的方向。

    【讨论】:

      【解决方案3】:

      您可能会在 GameDev.net 上 Greg Rosenblatt 关于用 C++ 创建脚本引擎的系列文章中找到价值 (http://www.gamedev.net/reference/articles/article1633.asp)。

      他采用的方法似乎偏向极简主义,因此可能是一种非常合适的方法,也可能是实现想法的良好来源。

      【讨论】:

      • 那是一篇好文章,我相信,他的一些想法已经成为我心理框架的一部分。想象一下操作码的映射,其中代码是键,值是处理该特定操作的函数。
      猜你喜欢
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多