Wie dump lua-Funktion chunk string?
How to dump lua-Funktion chunk string ?
function test(a, b)
local c = a + b
return c
end
print( type(test) ) --> function
print( test ) --> function: 0053B108
print( dumpToString(test) )
Wünsche ich dumpToString Ergebnis ist Folgendes:
function test(a, b)
local c = a + b
return c
end
Wie dies zu tun ?
=== update1 ===
Ich möchte die automatische Anmeldung und einfügen von code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht sagst warum Sie dies tun möchten, die wichtig sein können. Sie können dump-Funktion, um eine Zeichenfolge, es wird nicht nur eine sehr lesenswerte string; können Sie speichern und übertragen Sie Ihre Funktion auf diese Weise (zwischen kompatiblen Lua-Motoren):
Gibt es keine einfache Antwort (nach all den Jahren immer noch). Ich werde näher auf alternativen.
1 Prof. der Archäologie Antwort (und ein bisschen Demontage):
Die Antwort auf diese alte Frage liegt in primodial eine. Nämlich, luadec. Es ist wahrscheinlich, dass damals war das in Ausfallzeiten, sondern, zumindest ab jetzt, gibt es eine aktualisierte version, die Griffe lua-5.1-.3.
Darüber hinaus die
string.dump
stellt nicht eine komplette Kauderwelsch, gibt es ein Programm-code im raw-bytes der Maschinenbefehle, können Sie sehen, dass eine bessere Repräsentation von Menschen mitluac -l -p <filename>
.Vm-codes sind nicht gut dokumentiert, aber die Menschen haben etwas zusammen hier. Luajit hat eine etwas bessere Dokumentation über seinen eigenen Satz von Anweisungen.
Wiederaufbau code von vm-Anweisungen ist, was luadec tut. In der Theorie, Sie könnte auch splice Ihre eigenen Anweisungen, die rechts in die gedumpten string.
Jedoch, was auch immer trick, den Sie tun, um die bytecodes, die es erleben werden, Inkompatibilitäten zwischen verschiedenen Interpreten, einschließlich unterschiedlicher Versionen von lua selbst.
2. Eigentlich X
Umwandlung der Funktion in eine Zeichenfolge ist ein ganz besonderer Wunsch (es sei denn, du tust, code-Generierung, in dem Fall haben Sie schon die Zeichenfolge in den ersten Platz).
Den "Protokoll-und einschleusen von code" ist in der Tat ganz allgemein X, die rechtfertigen können, die Y gelöst werden. Aber einzelne Fälle können abgedeckt werden durch einzelne Maßnahmen.
Lua ist eine sehr flexible Sprache, und zum Beispiel könnten Sie verfolgen den Ablauf der Wert
x
im Beispiel, indem Sie ein Objekt:Wie im Beispiel oben könnten Sie injizieren Verhaltens durch Veränderung der Umwelt der Funktion. Nämlich, da hab ich neu definiert die Globale Funktion
tonumber
. Möchten Sie vielleicht komplett pack die Funktion in der unterschiedlichen Umwelt:Für ältere Versionen müssten Sie Griff upvalues, die möglicherweise Referenzen auf Globale Funktionen, die Sie versuchen, neu zu definieren. Für neuere Versionen, würden Sie haben, um die upvalues, die verloren gehen würden, während der dump-Prozess geladen.
3. Lesen von Dateien
Schließlich, wie andere gesagt haben, wenn Sie Zugriff auf die Quelle haben, können Sie versuchen, finden die definition der Funktion aus, die. Es sei denn, es ist eine einzelne Funktion definition oder einfache hin-Datei der Aufgabe vielleicht am Ende äquivalent zu re-Implementierung der lua-parser. Es gibt mehr als eine einzige von diesen, aber Sie waren nicht mit einer solchen Funktionalität im Auge, so dass es könnte einige Arbeit zu nutzen, Ihre-code.
Ob alle Funktionen werden definiert, indem Sie sich und Sie bereit sind, halten Sie sich ein wenig, Sie könnte verwenden lua metatables wieder, lösen Sie das problem während der codierungsphase:
Definieren upvalues wird schwierig sein, aber.
Nicht. Lua speichert keine kompilierten Lua-Skript als roher text überall. Und, da es beabsichtigt ist, eine kleine Skriptsprache, die es auch nicht einen Mechanismus bereitstellen, zu dekompilieren, seine eigenen bytecode.
require
,load
undloadfile
Funktionen (für Funktionen dynamisch erstellt während der Ausführung des Programms). Obwohl die Umsetzung dieser Idee vielleicht nicht so einfach.dofile
in der Liste der Funktionen. Auch, es funktioniert nicht, wenn der source-code wird vorkompiliert. Also nicht, dass die Methode nicht funktioniert, in der Regel entweder. Kurz Sie können nicht.dofile
. Aber ich Stimme mit Ihnen in der wichtigsten Frage. Bitte beachten Sie, dass die OP nicht Fragen, "tut Lua selbst behandeln Sie diese Dinge?". Die Frage war "Wie macht man das?", wich implizieren einige Anstrengungen von Seiten der Programmierer. Ihre Antwort scheint zu sein, zu pessimistisch für so ein mächtiges tool wie Lua.gut, Sie können speichern Sie Ihre mehrere Zeilen code in einem einzigen string-variable. Einfach mit doppelten eckigen Klammern statt Anführungszeichen.
Können Sie den source-code Ihres Programms, indem Sie
und analysieren es, um zu finden, die Ihre definition einer Funktion.
Es funktioniert nur beim ausführen von lua von der Kommandozeile aus und vorbei, es Quellcode-Datei als parameter, nicht eine bytecode-Datei.