【发布时间】:2012-03-23 14:20:21
【问题描述】:
我正在.NET (4.0) 之上实现一个小型 DSL,我目前正在使用表达式树将 DSL 转换为可执行代码块。
DSL 是预定义的,因为我们正在实现对旧文件格式的支持。
表达式树是最适合这项工作的工具吗?
【问题讨论】:
标签: c#-4.0 .net-4.0 expression-trees dsl
我正在.NET (4.0) 之上实现一个小型 DSL,我目前正在使用表达式树将 DSL 转换为可执行代码块。
DSL 是预定义的,因为我们正在实现对旧文件格式的支持。
表达式树是最适合这项工作的工具吗?
【问题讨论】:
标签: c#-4.0 .net-4.0 expression-trees dsl
如果你想生成新的类型,表达式树是没有用的。对于大多数典型的 DSL,您必须构建类型。所以,一个好的旧System.Reflection.Emit 可能是一个更好的选择。
【讨论】:
Reflection.Emit 如何更好地为我服务?
您可能会查看Boo 和更具体的Rhino.DSL,它是基于它构建的。要了解 Boo 带来的效果,Ayende's posts 是一个很好的开端。
Boo 被它的 inceptors 描述为:
一种新的面向对象的静态类型编程语言,用于公共语言基础架构,具有受 python 启发的语法,并特别关注语言和编译器可扩展性。
因此,基本上,它是 C# 的替代方案:同样可以编译,但更加灵活,您可以动态设置新的语言结构。表达式树只是其中的一小部分。
通过将 Boo 放置在管道中的某个位置,就像 Rhino.DSL 所做的那样,您可以释放出很多功能,甚至不需要臃肿或消耗性能(它仍然是运行的编译字节码)。
如果您查看the unit tests on Rhino.DSL,您将快速了解可能发生的事情。
但请注意:所有提到的存储库目前都非常不活跃(去年没有活动),但恕我直言,这并没有贬低它们的实际用途。
希望这对你有帮助。
【讨论】: