Das Projekt Mastersign.Expressions hat zum Ziel, eine einfache an die EXCEL-Formeln angelehnte DSL (domain specific language) für .NET-Anwendungen bereitzustellen. Das Zuhause des Projekts ist auf GitHub. Die kompilierte Bibliothek kann mit Nuget installiert werden.
Beispiel
Die Verwendung von Mastersign.Expressions ist sehr einfach:
using System;
using de.mastersign.expressions;
static class Program
{
static void Main()
{
// Erzeuge den Auswertungskontext für den Ausdruck
var context = new EvaluationContext();
// Lade die Standardfunktionen (Mathematik, Zeichenkettenverarbeitung, ...)
context.LoadAllPackages();
// Füge eine eigene Variable hinzu
context.SetVariable("x", 4);
// Füge eine eigene Funktion hinzu
context.AddFunction("neg", (Func<double, double>)(v => -v));
// Lege die Parameterliste fest
context.SetParameters(new ParameterInfo("a", typeof(int)));
// Kompiliere den Ausdruck zu einem Lambda-Delegat
var function = context.CompileExpression<int, double>("sin(PI * neg(10.0 + x)) + a");
// Rufe den Delegat auf und gib das Ergebnis aus
Console.WriteLine(function(2));
}
}
Variablen werden im Normalfall so kompiliert, dass sie zu jeder Zeit immer den aktuellen Wert im Auswertungskontext repräsentieren. Optional kann der Wert einer Variablen als konstant festgelegt werden, dann wird der Wert der Variablen als Konstante in den Delegaten kompiliert. Nachträgliche Änderungen, an einer als konstant markierten Variablen im Kontext, wirken sich nicht auf bereits kompilierte Delegaten aus. Dafür ist die Performance von Konstanten besser als die von echten Variablen.
Beispielanwendung
Als Demonstration von Mastersign.Expressions habe ich eine kleine Anwendung geschrieben, die ein Schwarzweißbild erzeugt. Das kompilierte Programm kann von GitHub heruntergeladen werden.
Für jedes Pixel des Bildes wird der eingegebene Ausdruck einmal ausgewertet und der Ergebniswert zwischen 0.0 und 1.0 als Helligkeitswert für das Pixel verwendet. Das Bild wird mehrmals pro Sekunde neu aufgebaut. Es stehen die folgenden Variablen zur Verfügung:
- W: Die Breite des Bildes in Pixeln
- H: Die Höhe des Bildes in Pixeln
- X: Die Position des aktuellen Pixels in X-Richtung (von links nach rechts)
- Y: Die Position des aktuellen Pixels in Y-Richtung (von oben nach unten)
- x: Die X-Position des aktuellen Pixels als reelle Zahl zwischen -0.5 und +0.5
- y: Die Y-Position des aktuellen Pixels als reelle Zahl zwischen -0.5 und +0.5
- T: Die aktuelle Zeit in Millisekunden
- t: Eine periodische Zeit zwischen 0.0 und 1.0 (wiederholt sich alle 10 Sekunden)
Mit diesen Variablen lassen sich einfache statische oder bewegte Muster berechnen.
Während der Eingabe wird stetig versucht den Ausdruck zu parsen und zu kompilieren. Auftretende Fehler werden direkt unter dem Eingabefeld angezeigt.
Syntaxfehler
Semantischer Fehler
Korrekte Eingabe
Bewegtes Muster
Das folgende Muster bewegt sich durch die Abhänigkeit von t nach links unten (in diesem Screenshot nicht zu erkennen).