Ich baue eine Tabellenkalkulation-ähnliche Anwendung, wo viele kleine Berechnungen in einer Baumstruktur zusammengefügt werden müssen. Diese Berechnungen sind benutzerdefiniert und ich brauche eine Möglichkeit für den Benutzer, sie zur Laufzeit einzugeben.Basieren Sie einen kleinen Ausdruck DSL auf dem DLR oder halten Sie ihn in F # von Hand gerollt?
Mein aktueller Ansatz ist es, einen kleinen "Ausdruck DSL" in F # zu schreiben, wo ich die Eingabe mit FParsec analysieren, einen Syntaxbaum basierend auf einer diskriminierten Union erstellen und dann den Ausdruck auswerten kann. Das funktioniert ziemlich gut.
Allerdings denke ich darüber nach, stattdessen die Sprache auf dem DLR zu gründen. Gibt es irgendwelche Vorteile, um diese Straße hinunter zu gehen (die Eingabe analysieren, die AST mit den Scripting.AST-Daten statt meiner eigenen generieren und die DLR die Ausführung der Berechnung übernehmen lassen)?
Jede Berechnung wird wahrscheinlich ziemlich klein sein. Die Abhängigkeit zwischen den Berechnungen wird auf einer höheren Ebene berücksichtigt.
Kann ich eine bessere Leistung erwarten, da der DLR CIL-Code für den Ausdruck generiert oder wird der Overhead dies auffressen?
(wie für eine vorhandene Sprache wie Ironpython verwendet, wird es wahrscheinlich schwierig sein, da ich plane eine Menge Slice-and-Dice-Operatoren und Dimensionalität-Handling-Material zum Sprachsyntax hinzufügen)
Vielen Dank für Ihre Einblicke. Ich habe die Linq Expression Bäume komplett übersehen. Ich werde versuchen, meinen Parser zu modifizieren, um mit dieser API Bäume zu generieren und einige Leistungstests für ihre Bewertung durchzuführen, um sie mit der naiven Interpretation/Bewertung zu vergleichen, die ich jetzt in F # mache. – Rickard
Beachten Sie, dass Sie F # -Angaben verwenden können, und in der FSharp.PowerPack.Linq-Bibliothek können Sie den F # -Anführungsausdruck in einen LINQ-Ausdrucksbaum konvertieren.Es gibt nicht eine Menge Dokumentation zu diesem Thema, aber Sie könnten interessiert sein. –