经过十多天煎熬,本宝宝终于顺利进入第二章,傲娇脸
首先,本章章首简要回顾了上一章的基本内容以及总体概述了data abstraction 的原因重要性,以及介绍了本章将会学习的一些东西
2.1.1通过一个rational arithmetic的例子来引出data abstraction 并且介绍基础pair 语法
ex2-1要求修改书中所给的make-rat使之能够在给定参数为-时,将符号放在分子出输出,两种思路
一 修改gcd 使之能够处理负数
二 利用abs 将gcd 参数约束为正数,并保留原先符号,在结果出进行修正
我们由于比较懒,所以选择第二种方式
以下为代码
(define (Gcd a b)
(define (reminder x y) (if (< x y) x (reminder (- x y) y)))
(if (= b 0) a (Gcd b (reminder a b)))
)
(define (make-rat n d)
(let ((g (Gcd (abs n) (abs d)))
(symbol
((lambda (a b)
(cond ((< (* a b) 0) -1)
((> (* a b) 0) 1)
((= a 0) 0)))
n d)
)
)
(cons (* symbol (abs (/ n g))) (abs (/ d g)))))
(define (rat+ x y)
(/ (+ (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))
(define (rat* x y)
(/ (* (car x) (car y)) (* (cdr x) (cdr y))))
(define (rat/ x y)
(/ (* (car x) (cdr y)) (* (cdr x) (car y))))
(define (rat- x y)
(/ (- (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))
(define (rat= x y)
(= (* (car x) (cdr y)) (* (car y) (cdr x))))
(define (print-rat x)
(newline)
(display (car x))
(display "/")
(display (cdr x))
0
)