Mastersign.Expressions

Mastersign.Expressions

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).