DynamicLua

So, ich denke es ist Zeit, die Katze aus dem Sack zu lassen, und mein neues Projekt vorzustellen: DynamicLua

Kurz ein paar Worte zum Hintergrund: Mit .NET 4.0 wurde die sog. Dynamic Language Runtime (DLR) eingeführt. Die dient zum einen dazu, es Entwicklern einfacher zu machen, neue Sprache auf .NET Basis zu entwickeln (wie IronPython/IronRuby), hat aber auch ein paar tolle andere Features zu bieten. Eines davon ist das neue Schlüsselwort „dynamic“. Es funktioniert ähnlich wie „var“ kann also jeden Typ annehmen. Wenn man darin aber ein Objekt speichert, das von System.Dynamic.DynamicObject abgeleitet ist, kann man bestimmen was passiert, wenn etwas „nicht erlaubtes“ passiert, also wenn z.B. eine Methode aufgerufen wird, die es gar nicht gibt. Solche Aufrufe landen dann bei der Methode TryInvokeMember, und die kann dann entscheiden, was passieren soll.

Dieses Konzept habe ich jetzt genutzt, um einen Wrapper für das LuaInterface zu schreiben. Das Lua Interface ist eine Library für .NET, die es erlaubt, Lua in C# zu benutzen. Dabei kümmert sie sich auch darum, .NET Objekte in Lua abzubilden und vieles mehr. Diese Library ist wirklich unglaublich, man denkt wirklich, Lua hätte was mit Objekten am Hut.

Meine Idee war es jetzt, über das LuaInterface eine neue Hülle zu stecken, die es zusammen mit der DLR ermöglicht, Lua noch einfacher in C# (und anderen .NET Sprachen zu benutzen). Hier ein kleines Beispiel:

// Start a new Lua interpreter
dynamic lua = new DynamicLua.DynamicLua(); //Namespace and class name are the same!
// Run Lua chunks
lua("num = 2"); //no DoString()!
lua("str = ’a string’");
// Read global variables ’num’ and ’str’
double num = lua.num; //No explicit casting, no index operator!
string str = lua.str;
// Write to global variable ’str’
lua.str = "another string"; //No index operator
//Increase a global value
lua.num += 10; //A LOT cleaner

Wie man sehen kann wird eine neue Instanz des Interpreters erzeugt, wenn man ihn aufruft wie eine Funktion wird der Lua Code ausgeführt. Variablen aus Lua sind einfach als Eigenschaften des Objektes vorhanden. Es ist kein Problem, .NET Klasse an Lua zu schicken, eine einfache Zuweisung reicht. Noch ein paar der Features:

  • Einfacher Zugriff auf Lua-Variablen
  • Aufruf von Lua-Funktionen aus C#
  • C#-Funktionen können in Lua Variablen gespeichert werden
  • Lua-Table können in C# Variablen gespeichert werden
  • Lua Metatables können in C# benutzt werden
  • Open-Source (Apache Lizenz 2.0)
  • Unit-Tests

Ich denke, mit DynamicLua ist es wirklich einfach Lua in C# einzubinden, weil vieles genau so funktioniert, wie man es erwarten würde. Das war zumindest mein Design-Ziel.

Genug der lobenden Worte, alles weitere ist auf der Codeplex-Seite zu finden: DynamicLua bei Codeplex. Momentan ist dort die Beta der Version 1.0 zu finden.

2 Gedanken zu „DynamicLua

    1. Also den LuaInterfaceDebugger kannte ich noch gar nicht 🙂 Von daher weiß ich auch nicht, ob er funktioniert, ich nehme es aber an, denn DynamicLua ist einfach nur ein Aufsatz auf dem LuaInterface. Es könnte allerdings sein, das der Code schwer zu debuggen ist, weil das eben alles noch durch DynamicLua läuft…
      Also: Einfach ausprobieren 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.