Вопрос

Есть ли удобный способ портировать код Lua к C #?

Самая большая проблема, вероятно, будет аккуратно портировать таблицы в некоторых словарях.

И предотвратить любое недоразумение: Нет, я не могу использовать встроенный Lua в мою программу.

Это было полезно?

Решение

Код, разработанный на таком очень динамичном языке, такой как Луа, нуждается в существенном рефакторинге, чтобы иметь смысл на статическом языке, таким как C # - два служат принципиально различными целями. Вы должны были бы снова написать такой код с нуля, реально, если он не использовал только самые основные функции любого языка, как основные численные / строки OPS.

Другие советы

Там нет простого способа сделать это.

Что вы хотите достичь? Преобразуйте файлы LUA в код C #, где вы хотите работать с ними широко, или вы просто хотите, чтобы какой-то код, который делает подобные вещи, чем исходный код.

Для первого типа преобразования ответ - это довольно сложно, но не невозможно. Вы должны разбирать код и повторно создать одинаковую (динамическую) функциональность в C #. Рамки, такие как Linfu.reflection, могут помочь здесь, потому что они добавят некоторую динамическую функциональность CLR.

Для второго типа, моя идея состоит в том, чтобы преобразовать Bytecode Lua в C # вместо исходного кода. Это не должно быть слишком сложно, главным образом, потому что Lua не имеет большого количества Опкодов (около 30, если я вспоминаю это правильно). Из этих офкодов самым сложным для преобразования являются операторы логики и прыжка (потому что у вас нет Go GoTo в C #), но если вы держите операторы потока (и преобразовать их в C # - это более или менее выполнено), и только Скомпилируйте код между и преобразовывать результат Bytecode к C # должен выполнять работу. Конечно, таким образом, вы много потеряете от удовольствия от числа оригинала, и поддерживая его намного сложнее.

Вы также можете попробовать найти решение между этими двумя краевыми чехлами, которые я написал здесь. Некоторые конструкции могут быть легко перенесены (в основном петли и простые арифметические операторы), но падают обратно в представление OPCode для обработки таблиц.

Универсальный транспортер Может перевести небольшое подмножество 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+"!";
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top