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