我希望能够在我的应用程序的外部位置指定数学规则,并让我的应用程序在运行时处理它们并执行操作(再次在外部描述)。这样做的最佳方式是什么?
例如,当以下评估为MyFunction1()
时,我可能想要执行函数true
:
(a < b) & MyFunction2() & (myWord == "test")
。
提前感谢您的帮助。
(如果它有任何相关性,我希望使用C ++,C或C ++ / CLI)
答案 0 :(得分:3)
我认为不要重新发明轮子---使用嵌入式脚本引擎。这意味着您将使用标准表单来描述操作和逻辑。有几个很好的选择,可能会满足您的需求。
好的选择包括:
Javascript虽然谷歌v8。 (从嵌入的角度来看,我不喜欢这个, 但javascript很容易使用,很多人已经知道了)
的Lua。它快速便携。语法可能不如Javascript好,但嵌入是 容易。
的Python。干净的语法,很多库。嵌入并没有太多乐趣。
我考虑使用SWIG帮助生成绑定...我知道它适用于python和lua,不确定v8。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果您的数学表达语言如此简单,那么您可以为它定义语法,例如:
expr = bin-op-expr | rel-expr | func-expr | var-expr | "(" expr ")"
bin-op = "&" | "|" | "!"
bin-op-expr = expr bin-op expr
rel-op = "<" | ">" | "==" | "!=" | "<=" | ">="
rel-expr = expr rel-op expr
func-args = "(" ")"
func-expr = func-name func-args
var-expr = name
然后将其转换为解析器的语法。例如。您可以使用Boost.Spirit,它提供了一个DSL,允许您在C ++代码中表达语法。
答案 3 :(得分:0)
如果计算发生在内部循环中,您需要高性能,则不能使用脚本语言。基于“可部署”的方式以及您希望的平台多少:
1)你可以用C ++表达方程式,让g ++在运行时为你编译它,你可以链接到生成的共享对象。但是这种方法在每一步都非常依赖于平台!必要的系统调用,编译器使用,标志,加载共享对象(或DLL)......但最终会超级快,特别是如果你用方程式编译最里面的循环。该等式将被内联并且全部。
2)你可以用同样的方式使用java。你可以在java中获得一个很好的java编译器(我想从Eclipse开始,但你可以轻松地嵌入它)。使用这个解决方案,结果会稍微慢一些(取决于你想要多少模板魔法),我预计,对于大多数用途来说,这个数字会减少2倍。但这种解决方案非常便携。一旦你使它工作,没有理由它不应该在任何地方工作,你不需要任何外部的程序。另一个缺点是必须用Java语法编写方程式,这对于复杂的数学来说是丑陋的。在这方面,第一种解决方案要好得多,因为运算符重载极大地有助于数学方程式。
3)我对C#了解不多,但可能有类似于(2)的解决方案。如果有的话,我知道在C#中有运算符重载,所以你的方程式编写和查看会更愉快。