在DLR上建立一个小型表达式DSL,还是用F#手动滚动?

Ric*_*ard 6 dsl f# dynamic-language-runtime expression-trees

我正在构建一个类似电子表格的应用程序,其中许多小型计算需要在树结构中拼接在一起.这些计算是用户定义的,我需要一种方法让用户在运行时输入它们.

我目前的方法是在F#中编写一个小的"表达式DSL",我用FParsec解析输入,基于区分联合构建语法树,然后可以计算表达式.这非常有效.

但是,我正在考虑将语言基于DLR.沿着这条路走下去是否有任何优势(解析输入,使用Scripting.AST东西而不是我自己的东西生成AST,让DLR处理计算的执行)?

每次计算都可能非常小.计算之间的依赖关系将在更高层次上得到处理.

我可以期待更好的性能,因为DLR会为表达式生成CIL代码,或者开销是否会消耗掉它?

(至于使用像IronPython这样的现有语言,它可能很难,因为我计划在语言语法中添加很多切片和骰子操作符和维度处理的东西)

Chr*_*ith 7

用如此广泛的术语回答问题很困难,但这里有一些我的想法.

使用F#构建解析器听起来不错.

FSParsec是一个很棒的库.我对FSLex和FSYacc有点偏爱.无论哪种方式,在F#中都有专为解析而设计的库,可以节省您的时间.

使用DLR生成代码听起来不错.

DLR是动态代码生成的绝佳平台.但是,您的应用程序更加具体.如果您仅限于计算值,则应使用.NET 3.5中的Expression Trees API.此API旨在表示任意代码表达式.另一方面,DLR被设计为运行时或动态语言.我不是说这是不可能的,只是它不适合这项工作.

不要编译生成的代码.

如果你确实使用DLR来表示你的AST,那么编译和执行的成本可能比简单地解释树要大得多.如果出现以下情况,请编译代码:A.)您多次执行相同的函数/方法或B.)函数/方法非常复杂.

C#+ DLR,IronPython,F#或三者的某些组合都是合理的选择.最终,"正确"选择是尽可能快地完成工作的选择.