6.9 小结

Scala社群热衷于DSL事出有因。Scala作为现今最具影响力的编程语言之一,为设计富有表现力的DSL提供了一流的支持。

本章已经逐一展示能用于内部DSL设计的Scala语言特性。我们从一份Scala特性名单开始,然后通过分析证券交易领域的众多DSL片段,认真深入分析这些DSL片段的设计。从结构上说,DSL是底层实现模型上的一重门面。本章的讨论焦点在领域模型与它上的语言抽象之间来回切换。

DSL需要在契约层次上表现出它的组合能力,避免暴露任何实现细节。你的设计从一开始就要遵循这样的原则,因为不同的DSL有不同的发展步调,需要修改某一个DSL的实现时,不要影响其他DSL或者核心应用。我们还介绍了不同的Scala内部DSL之间,怎样利用Scala强大的类型系统,静态地组合到一起。在最后阶段的讨论中,我们观察了Monad化的操作怎样帮助创建具有组合能力的DSL构造单元。Monad在Scala语言中的位置并不像它在Haskell编程模型中的地位那么显著,但用处并不小。Scala的Monad化语法for comprehension可以用来排列领域操作的顺序,同时不引入过多的非本质复杂性。

要点与最佳实践

  • Scala语法简练,可省略句末分号,具备类型推断特性。这些特性可以使DSL的表面语法保持紧凑。

  • Scala有丰富的语言构造可作为设计抽象的手段,请充分利用类、trait、对象等元件去提高DSL实现的扩展能力。

  • Scala提供了强大的函数式编程能力。请善用这种能力来对DSL中的行为进行抽象。摆脱对象范式的锢囿,使DSL实现对用户的表现力更强。

内部DSL需要一种宿主语言,有时会受到宿主语言能力的限制。打破这些限制的方法之一是自己设计一种外部DSL。下一章将探讨外部DSL的若干基本构件。从编译器和语法分析器的一些基本理论入手,然后过渡到分析器组合子(parser combinator)等目前广泛使用的高阶结构。敬请期待!