天天看点

《编程导论(Java)·0.2.2 操作符和操作数》first-class

最简单的代码“MOV  AX,1234H”刻画出程序的最为底层的构造单元:指令和数据。

本文对《编程导论(Java)·0.2.2 操作符和操作数》进行扩展。

1.操作符和操作数的区别

首先,操作符和操作数是两个东西。1+2、或(+ 2 3)中+是操作符、数字是操作数。

注意,操作符、函数或执行代码,这里都视为操作符。

2.操作符和操作数的统一

冯•诺伊曼体系结构(von Neumann architecture)计算机,程序和数据能够以相似的方式来表示并存储到相同的内存储器中。这就是存储-程序(the stored program)概念。

那么,我们希望操作符和操作数在某种程度上统一。统一的方向是什么呢?

(1)操作数作为操作符?将表示信息的实体(操作数)作为操作符,通常不是好主意;或者说,“完全可以没有数,仅仅对函数做各类操作”,不是好主意。虽然函数编程语言中的一切元素,归根结底都是λ表达式(丘奇的λ运算),但是在函数编程语言中,还是需要操作数!

(2)操作符作为操作数。函数作为数据!这才是我们的统一方向。操作符、函数或执行代码或程序,和数据能够以相似的方式来表示并存储到相同的内存储器中,我们如何像对待数据那样处理函数呢?

在《2.2.2 Java数据类型》中介绍到,值将被保存在变量中、被作为参数传递、被方法返回以及被操作符操作。于是,我们也需要考虑,如何将函数

  • 保存在变量中
  • 作为参数传递
  • 由方法返回
  • 被操作符操作(这可以归结为2和3)[可以包含在数据结构中——SICP]

上面4点,很重要!!具有这个特点的程序元素被称为 first-class 元素—— 第一级/一阶元素或头等元素, first-class Java citizens。

  • 函数被作为参数传递、被方法返回,这就是所谓的高阶函数;
  • 函数保存到变量中,这就需要编程语言提供一种类型来表示函数。在Scheme语言中,所有函数属于 procedure?类型,C语言中通过函数指针来指向函数,而Java 8目前没有提供函数类型、也没有提供函数引用或函数指针,在这种情况下,我们只能够说Java的λ表达式是似、仿或伪函数。Java8 的目的,是让程序员认为Java的λ表达式是函数,如同让程序员认为人妖是女人。