您的位置:首页 > 编程语言

2.3.2.2 面向语言编程(Language-oriented programming)

2014-09-02 08:37 375 查看
2.3.2.2 面向语言编程(Language-oriented programming)

面向语言编程,可视为另一种编程范式,但定义不是很明确。其原则是,能尽力以更利于自然阅读的方式写代码,能实现这一目标的语言,必须提供更多的灵活性。

在本节,我们将会看到,一个相对简单的语法改变,可以为给我们思考问题提供一个完全不同的角度。清单 2.4 显示了以全新方法写相同的代码,返回奇数的平方。这个示例只是为了说明观点,因此不必完全理解,我们会在本书的后面讨论面向语言编程和列表处理。这个示例的观点体现了不同的思考方式。

清单 2.4 优雅地使用函数 (F# Interactive)

> let squared =

numbers

|>List.filter isOdd

|>List.map square;;

val it : int list = [1; 9; 25; 49; 81]

现在不再使用嵌套函数调用,而是用管道运算符(| >),这种结构可以把表达式成一系列应用了数据的运算。代码仍然用通常的 F# 语言编写,但如果你不知道的话,会认为这是用数据处理语言写的。

注意

从 F# 的角度来看,代码也没有什么特别的,F# 可以写自定义的运算符,管道运算符只是我们自己可以定义的众多运算符中的一个。其余的代码使用了相应的参数化高阶函数。

我们可以看看这组列表处理结构(如|>,List.map,等等),就好像是单独嵌入 F# 中的列表处理语言,这就是“面向语言编程(language-oriented programming)”。虽然代码是作为完全标准 F# 库实现的,但它看起来就好像是专门为这个问题而特别设计的语言,因此,代码更具可读性。事实上,许多设计良好的函数库看起来就如同声明式语言。

函数库看起来好像是专为解决特定问题的声明式语言,这是声明式风格的关键,它最大的好处是能够在大的团队中进行分工协作。我们不一定非得是 F# 大师,理解如何使用列表处理“语言”,或者任何其他已有的库。就是说,我们即使是一个F# 新手,也能够很快学习使用现有的库去解决问题。当然,实现这样的库是相当困难的,因此,这通常是由经验丰富的F# 开发团队完成的。

本书的目的是培训函数大师,因此,我们将在后面的章节来讨论这个问题。在第六章,我们将学习写高阶函数来处理列表和其他基本类型。高阶函数基本上是用于设计函数库,但是,在这一节我们也看到,它还可以使代码看起来更自然。在第十五章,我们要更进一步,设计一个目标库,使用尽可能自然的语法创建动画。

LISP 的面向语言编程

LISP 出现于 1958 年,是仍在正常使用的最古老的高级语言(还有 FORTRAN),还包括一些流行的 LISP 方言,包括 Common Lisp 和 Scheme。来自这个家族的语言广为人知,是因为它们极其灵活的语法,LISP 能够模仿许多高级编程技术,不仅包括面向对象编程,而且还包括一些并不广为人知的方法,如面向方面编程(aspect-oriented programming,AOP)。AOP 是当今已有语言,如AspectJ,也有库,如 PostSharp,还有基于原型的对象系统(亦见于 JavaScript)。

在 LISP 中写的一切,要么是列表,要么是符号。比如,可以写(- n 1),这是一个包含三个符号的列表:-、n、1。LISP 把程序代码视为:调用函数-(二元减法运算符),它有两个参数值:n 和 1。如果不熟悉这种语法,代码有点难以阅读,但我们只是想说明,思想能走多远,语言就能走多远。在使用 LISP 解决疑难问题时,我们几乎总是要创建自己的语言(基于 LISP 语法),专为解决这个问题。可以简单地自己定义符号,使其具有特殊的意义,并指定用这些符号写的代码如何运行。

我们在第一章讨论声明式动画时,看到过一些类似的内容,因此,我们知道,即使用 C# 也可以写面向语言的代码。我们将在第十五章讨论这个示例,你将看到在 C# 和 F# 中面向语言是如何做到的。

用声明编程风格扩展词汇,能够用来表达我们的意图,但还需要保证我们添加的基元(primitives)能够正确地使用。在下一节,我们将讨论类型,正是服务于基元的“语法规则”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: