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

728 篇文章 1 订阅
349 篇文章 0 订阅

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)能够正确地使用。在下一节,我们将讨论类型,正是服务于基元的“语法规则”。

Object-oriented programming, like most interesting new developments, builds on some old ideas, extends them, and puts them together in novel ways. The result is many-faceted and a clear step forward for the art of programming. An object-oriented approach makes programs more intuitive to design, faster to develop, more amenable to modifications, and easier to understand. It leads not only to new ways of constructing programs, but also to new ways of conceiving the programming task. Nevertheless, object-oriented programming presents some formidable obstacles to those who would like to understand what it’s all about or begin trying it out. It introduces a new way of doing things that may seem strange at first, and it comes with an extensive terminology that can take some getting used to. The terminology will help in the end, but it’s not always easy to learn. Moreover, there are as yet few full-fledged object-oriented development environments available to try out. It can be difficult to get started. That’s where this book comes in. It’s designed to help you become familiar with object-oriented programming and get over the hurdle its terminology presents. It spells out some of the implications of object-oriented design and tries to give you a flavor of what writing an object-oriented program is really like. It fully documents the Objective-C language, an object-oriented programming language based on standard C, and introduces the most extensive object- oriented development environment currently available—OPENSTEP.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值