有没有简单的方法将Lua代码移植到C#?
最大的问题可能是在某些字典中整齐地移植表格。
为了防止任何误解:我不能在我的程序中使用嵌入式Lua 。
答案 0 :(得分:2)
像Lua这样的高度动态语言设计的代码需要进行大量的重构才能在C#这样的静态语言中有意义 - 这两种语言服务于根本不同的目的。实际上,你必须从头开始重新编写这样的代码,除非它只使用任何语言的最基本功能,比如基本的数字/字符串操作。
答案 1 :(得分:1)
没有简单的方法可以做到这一点。
答案 2 :(得分:0)
你想要达到什么目的?将lua文件转换为C#代码,您可以在其中广泛使用它们,或者只是想要一些与原始代码类似的代码。
对于第一种类型的转换,答案是它很难,但并非不可能。您必须解析代码并在C#中重新创建相同(动态)功能。像LinFu.Reflection这样的框架可以在这里提供帮助,因为它们会为CLR添加一些动态功能。
对于第二种类型,我的想法是将lua字节码转换为C#而不是原始代码。这应该不会太难,主要是因为lua没有太多操作码(如果我没记错的话,大约30个)。从这些操作码中最难转换的是逻辑和跳转操作符(因为你没有在C#中使用goto),但是如果保持流操作符不变(并将它们转换为C# - 或多或少可以实现),并且只有编译之间的代码,并将结果字节码转换为C#应该完成的工作。当然,通过这种方式,您将从原始代码的可读性中损失很多,并且维护它将会更加困难。
您也可以尝试在我写的这两个边缘情况之间找到解决方案。一些构造可以很容易地移植(主要是循环和简单的算术运算符),但是回退到用于表处理的操作码表示。
答案 3 :(得分:0)
Universal-transpiler可以将Lua的一小部分翻译成其他几种语言,包括C#。这是一个为SWI-Prolog编写的例子:
:- use_module(library(transpiler)).
:- set_prolog_flag(double_quotes,chars).
:- initialization(main).
main :-
translate("function add(a,b) return a + b end function squared(a) return a*a end function add_exclamation_point(parameter) return parameter .. \"!\" end",'lua','c#',X),
atom_chars(Y,X),
writeln(Y).
这是它生成的C#源代码:
public static int add(int a,int b){
return a+b;
}
public static int squared(int a){
return a*a;
}
public static string add_exclamation_point(string parameter){
return parameter+"!";
}