Sto costruendo un'applicazione simile a un foglio di calcolo, dove è necessario ricamare molti piccoli calcoli in una struttura ad albero. Questi calcoli sono definiti dall'utente e ho bisogno di un modo per l'utente di inserirli in fase di runtime.Basare una piccola espressione DSL sul DLR o tenerlo arrotolato a mano in F #?
Il mio approccio attuale è scrivere una piccola "espressione DSL" in F #, dove analizzo l'input con FParsec, costruisco un albero di sintassi basato su un'unione discriminata e quindi posso valutare l'espressione. Funziona piuttosto bene.
Tuttavia, sto pensando di cercare di basare la lingua sul DLR. Ci sono dei lati positivi per percorrere questa strada (analizzare l'input, generare l'AST usando il materiale Scripting.AST invece del mio e lasciare che il DLR gestisca l'esecuzione del calcolo)?
Ogni calcolo sarà probabilmente piuttosto piccolo. La dipendenza tra i calcoli sarà gestita ad un livello superiore.
Posso aspettarmi prestazioni migliori dal momento che il DLR genererà il codice CIL per l'espressione o il sovraccarico lo mangerà?
(come per l'utilizzo di una lingua esistente come IronPython, probabilmente sarà difficile da quando ho intenzione di aggiungere un sacco di operatori slice-and-dice e roba dimensionalità di gestione per la sintassi del linguaggio)
Grazie per i vostri approfondimenti. Ho completamente trascurato gli alberi di espressione linq. Proverò a modificare il mio parser per generare alberi usando questa API e fare alcuni test delle prestazioni sulla loro valutazione per confrontare con l'interpretazione/valutazione naive che sto facendo ora in F #. – Rickard
Si noti che è possibile utilizzare le citazioni F # e nella libreria FSharp.PowerPack.Linq è possibile convertire l'espressione Quotazione F # in un albero di espressioni LINQ.Non c'è una tonnellata di documentazione su questo, tuttavia, ma potresti essere interessato. –