about summary refs log tree commit diff
path: root/sicp/chapter2.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'sicp/chapter2.rkt')
-rw-r--r--sicp/chapter2.rkt52
1 files changed, 52 insertions, 0 deletions
diff --git a/sicp/chapter2.rkt b/sicp/chapter2.rkt
new file mode 100644
index 0000000..2915203
--- /dev/null
+++ b/sicp/chapter2.rkt
@@ -0,0 +1,52 @@
+#lang sicp
+; Exercise 2.1
+(define (make-rat n d)
+  (if (< d 0)
+      (make-rat (- n) (- d))
+      (let ((g (gcd n d)))
+        (cons (/ n g) (/ d g)))))
+(define numer car)
+(define denom cdr)
+(define (print-rat x)
+  (display (numer x))
+  (display "/")
+  (display (denom x))
+  (newline))
+(define (add-rat x y)
+  (let ((dx (denom x))
+        (dy (denom y)))
+    (make-rat (+ (* (numer x) dy)
+                 (* (numer y) dx))
+              (* dx dy))))
+(define (sub-rat x y)
+  (add-rat x (make-rat (- (numer y)) (denom y))))
+(define (mul-rat x y)
+  (make-rat (* (numer x) (numer y))
+            (* (denom x) (denom y))))
+(define (div-rat x y)
+  (make-rat (* (numer x) (denom y))
+            (* (denom x) (numer y))))
+(define (equal-rat? x y)
+  (= (* (numer x) (denom y))
+     (* (numer y) (denom x))))
+
+; Exercise 2.2
+(define make-point cons)
+(define x-point car)
+(define y-point cdr)
+(define make-segment cons)
+(define start-segment car)
+(define end-segment cdr)
+(define (average x y) (/ (+ x y) 2))
+(define (midpoint-segment d)
+  (let ((A (start-segment d))
+        (B (end-segment d)))
+    (make-point (average (x-point A) (x-point B))
+                (average (y-point A) (y-point B)))))
+(define (print-point P)
+  (display "(")
+  (display (x-point P))
+  (display ", ")
+  (display (y-point P))
+  (display ")")
+  (newline))