HAVE YOU READ YOUR SICP TODAY?

SICP围绕抽象这个问题展开了深刻的讨论。
为了更加通俗易懂,我这里使用python来表达(原书使用Scheme)
首先看一个例子,我们如何来表达分数这种数据结构

class Fraction(object):
    def __init__(self, x, y):
        self.numer = x
        self.denom = y

    def __add__(self, other):
        return self.__class__(other.denom*self.numer+self.denom*other.numer, other.denom*self.denom)

    def __str__(self):
        return '{0}/{1}'.format(self.numer, self.denom)

过程

def fraction(numer, denom):
    def dispatch(m):
        if m==0:
            return numer
        elif m==1:
            return denom
        else:
            raise IndexError
    return dispatch


def add(x, y):
    return fraction(x(0)*y(1)+y(0)*x(1), x(1)*y(1))

def display(f):
    return '{0}/{1}'.format(f(0),f(1))

方法2体现了数据也可以用过程来表现,这种程序设计风格也称为消息传递。如果你觉得这种思维还不足以令人称奇,那么请考虑,我们是否需可以完全没有数。下面代码实现了0和加1的操作

(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n) lambda (f) (lambda (x) (f ((n f ) x)))))

这一表示形式称为Chruch Numerals。