Groovy,Kotlin和Scala等语言为DSL提供了开箱即用的支持(例如:Groovy DSL和Kotlin Type-Safe Builders(。OCaml/ReasonML是否支持其核心语言或核心库中的DSL?
当然,这是函数式编程的主要功能,所以你不能在OCaml中做到这一点会很惊讶。ML是如此自然,以至于不需要任何特殊的工具或技术。
让我们举一些例子。我将从我创作的库开始,它被称为 Ogre,它提供了一种完全嵌入在 OCaml 中的类型安全查询语言,OCaml 类型检查器验证查询是否类型正确。以下是一些示例。
-
选择所有 GPA 率大于 3.8 的学生。
select ~where:(student.(gpa) > float 3.8) (from students)
-
选择所有 GPA 大于 3.8 的学生及其相应的教师(假设教师是教师表的外键(。
select ~where:(student.(gpa) > float 3.8) ~join:[[field teacher ~from:student; field id ~from:teacher]] (from students)
-
以下 SQL 语句
SELECT name FROM students WHERE gpa > 3.5
表示为,
foreach Query.(select
~where:(student.(gpa) > float 3.8)
(from students))
~f:(fun s -> return (Student.name s))
用OCaml编写eDSL的一个很好的资源是Oleg的ML页面。另一个示例是用于编写 CI/CD 管道的 eDSL。当然,我不能错过TyXML,但这是一个稍微不同的故事。无论如何,还有很多其他的例子,但我希望这足以获得这种感觉。