我正在构建一个类似于电子表格的应用程序,在该应用程序中,许多小计算需要以树形结构拼接在一起。这些计算是用户定义的,我需要一种让用户在运行时输入它们的方法。
我当前的方法是在F#中编写一个小的“表达式DSL”,在其中使用FParsec解析输入,基于已区分的并集构建语法树,然后可以评估该表达式。这工作得很好。
但是,我正在考虑将语言作为DLR的基础。在这方面还有什么好处(解析输入,使用Scripting.AST东西(而不是我自己的东西)生成AST,并让DLR处理计算的执行)?
每次计算可能会很小。计算之间的依存关系将在更高层次上得到解决。
我可以期待更好的性能,因为DLR将为该表达式生成CIL代码,还是开销会吃掉它?
(对于使用像IronPython这样的现有语言,由于我计划在语言语法中添加很多切片和切分运算符和维处理内容,这可能会很难)
最佳答案
如此广泛的问题很难回答,但这是我的一些想法。
使用F#构建解析器听起来不错。
FSParsec是一个很棒的库。我有点偏爱FSLex和FSYacc。无论哪种方式,在F#中都有专门为解析而设计的库,可以节省您的时间。
使用DLR生成代码听起来不错。
DLR是动态代码生成的绝佳平台。但是,您的应用程序更加具体。如果将自己限制为仅计算值,则应使用.NET 3.5中的Expression Trees API。该API旨在表示任意代码表达式。另一方面,DLR被设计为运行时或动态语言。我并不是说这是不可能的,只是它不是这项工作的正确工具。
不要编译您生成的代码。
如果您确实使用DLR来表示您的AST,则编译和执行的成本可能比仅解释树要高得多。如果出现以下情况,请编译代码:A.)您多次执行相同的函数/方法,或者B.)函数/方法非常复杂。
C#+ DLR,IronPython,F#或这三者的某种组合都是声音选择。最终,“正确”的选择是使工作尽快完成的选择。
关于f# - 在DLR上使用小表达式DSL还是在F#中手动滚动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1548172/