Domanda

esiste un modo semplice per porto di codice Lua in C #?

Il problema più grande sarebbe probabilmente alle tabelle porta ordinatamente in alcuni dizionari.

E per evitare ogni equivoco:. no non posso utilizzare incorporato Lua nel mio programma

È stato utile?

Soluzione

Codice progettato in un tale linguaggio altamente dinamico come Lua avrebbe bisogno sostanziale refactoring per dare un senso in un linguaggio statico come C # - i due servono scopi fondamentalmente diversi. Si dovrà riscrivere tale codice di nuovo da zero, realisticamente, a meno che non ha usato solo la maggior parte delle caratteristiche di base di tutte le lingue, come ops base numerico / stringa.

Altri suggerimenti

Non c'è modo più semplice per farlo.

Che cosa si vuole raggiungere? Convertire i file LUA per codice C #, in cui si desidera lavorare con loro ampiamente, o se si vuole semplicemente un codice che fa cose simili rispetto al codice originale.

Per il primo tipo di conversione, la risposta è che è molto difficile, ma non impossibile. È necessario analizzare il codice e ricreare lo stesso (dinamica) funzionalità in C #. Framework, come LinFu.Reflection può aiutare qui, perché saranno aggiungere alcune funzionalità dinamica per CLR.

Per il secondo tipo, la mia idea è quella di convertire il bytecode lua per C # al posto del codice originale. Questo non dovrebbe essere troppo difficile, soprattutto perché lua non ha molto codici operativi (circa il 30 se non ricordo correttamente). Da questi codici operativi i più difficili da convertire sono gli operatori logici e di salto (perché non si dispone di goto in C #), ma se si tengono i gestori di flusso intatto (e convertirli in C # - che è più o meno attuabile), e solo compilare il codice tra, e convertire il bytecode risultato per C # dovrebbe fare il lavoro. Naturalmente in questo modo si perde un sacco dalla leggibilità del codice originale, e la manutenzione sarà molto più difficile.

Si potrebbe anche provare a trovare una soluzione fra questi due casi limite che ho scritto qui. Alcuni costrutti possono essere facilmente trasferite (principalmente i loop, e le operazioni aritmetiche semplici), ma ripiegano alla rappresentazione codice operativo per la gestione della tabella.

Universal-transpiler può tradurre un piccolo sottoinsieme di Lua in diverse altre lingue, tra cui C #. Questo è un esempio, scritto per 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).

Questo è il codice sorgente C # che genera:

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+"!";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top