我最近开始阅读一些与 F# 相关的文献,谈到“Real World Functional Programming”和“Expert F#”,例如。一开始很容易,因为我有一些 Haskell 的背景,并且知道 C#。但是当谈到“面向语言的编程”时,我就是不明白。- 我读了一些解释,就像读了一篇每一句话都变得更加抽象和奇怪的学术论文。
有没有人有一个简单的例子来说明这种东西,以及它与现有范式的比较?这不仅仅是学术幻想,不是吗?;)
谢谢,希望
面向语言的程序 (LOP) 可用于描述以下任何内容。
这可能是 LOP 最常见的用途,并且是您拥有特定域的地方 - 例如 UPS 通过路线运输类型的运输包裹等。与其尝试在程序代码中编码所有这些特定于域的实体,您而是为该领域创建单独的编程语言。因此,您可以使用单独的外部语言对您的问题进行编码。
有时您希望您的程序代码看起来不像“代码”并且更接近问题域。也就是说,让代码“更自然地阅读”。流利的界面就是一个例子:流利的界面。此外,F# 具有很好地支持这一点的活动模式。
不久前,我在 LOP 上写了一篇博文,其中提供了一些代码示例。
F# 有一些机制可以以一种可以称为“面向语言”的风格进行编程。
首先,语法细节(函数调用不需要括号,可以定义自己的中缀运算符,...)使得许多用户定义的库具有嵌入式 DSL 的外观。
其次,F#“引用”机制可以让您引用代码,然后使用替代语义/评估引擎运行它。
第三,F#“计算表达式”(又名工作流、monad、...)还提供了一种为某些代码块提供一种替代语义的方法。
所有这些都属于 EDSL 类别。
在面向对象编程中,您尝试使用对象对问题建模。然后,您可以将这些对象连接在一起以执行功能……并最终解决原始问题。
在面向语言的编程中,不是使用现有的面向对象或函数式编程语言,而是设计一种最适合有效解决问题的新领域特定语言。
面向语言的编程一词可能会被重载,因为它可能对不同的人有不同的含义。
但就我使用它的方式而言,这意味着您在开始解决问题之前创建了一个 DSL( http://en.wikipedia.org/wiki/Domain_Specific_Language )。
创建 DSL 后,您将根据 DSL 编写程序。
这个想法是您的 DSL 比通用语言更适合表达问题。
一些示例是 make 文件语法或 Ruby on Rails ActiveRecord 类。
我没有在现实世界中直接使用面向语言的编程(创建一种实际的语言),但思考并帮助设计更好的领域驱动对象很有用。
从某种意义上说,在 Lisp 或 Scheme 中的任何实际开发都可以被认为是“面向语言的”,因为您正在开发应用程序的“语言”及其抽象树,因为您正在编写代码。 Cucumber是我听说过的另一个真实的例子。
请注意,这种方法(以及任何领域驱动的方法)在实际开发中存在一些问题。我之前处理过的一个主要问题是在域中有意义的逻辑与在软件中有意义的逻辑之间的不匹配。领域(业务)逻辑可能非常复杂且毫无意义——并导致领域模型崩溃。
此处提到的领域特定语言的一个简单示例是 SQL。另外:UNIX shell 脚本。
当然,如果你做了很多基本的操作,并且与底层语言有很多重叠,那很可能是过度工程。