Pergunta

Existe alguma maneira fácil de portar o código Lua para C#?

O maior problema provavelmente seria portar tabelas de porte em alguns dicionários.

E para evitar qualquer mal -entendido: Não, não posso usar Lua incorporado no meu programa.

Foi útil?

Solução

O código projetado em uma linguagem altamente dinâmica como Lua precisaria de refatoração substancial para fazer sentido em uma linguagem estática como C#- os dois servem a propósitos fundamentalmente diferentes. Você teria que reescrever esse código novamente do zero, realisticamente, a menos que ele tenha usado apenas os recursos mais básicos de qualquer idioma, como o Ops numérico/string básico.

Outras dicas

Não há maneira fácil de fazer isso.

O que você quer alcançar? Converta os arquivos Lua em código C#, onde você deseja trabalhar com eles extensivamente, ou você deseja apenas algum código que faça coisas semelhantes que o código original.

Para o primeiro tipo de conversão, a resposta é que é bastante difícil, mas não impossível. Você precisa analisar o código e recriar a mesma funcionalidade (dinâmica) em C#. As estruturas, como o Linfu.reflexão, podem ajudar aqui, porque adicionarão alguma funcionalidade dinâmica ao CLR.

Para o segundo tipo, minha idéia é converter o bytecode Lua em C# em vez do código original. Isso não deve ser muito difícil, principalmente porque o Lua não possui muitos códigos de operações (cerca de 30 se bem me lembro). A partir desses códigos de operações, os mais difíceis de converter são os operadores de lógica e salto (porque você não tem Goto em C#), mas se você mantiver os operadores de fluxo intactos (e converter -os em C# - isso é mais ou menos realizado) e apenas Compile o código entre e converta o resultado ByTecode em C# deve fazer o trabalho. É claro que dessa maneira você perderá muito com a legibilidade do código original e mantê -lo será muito mais difícil.

Você também pode tentar encontrar uma solução entre esses dois casos de borda que escrevi aqui. Algumas construções podem ser facilmente portadas (principalmente os loops e os operadores aritméticos simples), mas voltam à representação do código OPC para manuseio de tabela.

Universal-Transpiler pode traduzir um pequeno subconjunto de Lua em vários outros idiomas, incluindo C#. Este é um exemplo, escrito para 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).

Este é o código -fonte C# que ele gera:

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+"!";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top