Skip to content

Instantly share code, notes, and snippets.

@kinoshita-lab
Created June 28, 2011 12:38
Show Gist options
  • Save kinoshita-lab/1051047 to your computer and use it in GitHub Desktop.
Save kinoshita-lab/1051047 to your computer and use it in GitHub Desktop.
sicp chapter 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 2.1.1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (make-rat n d)
(cons n d))
(define (numer x)
(car x))
(define (denom x)
(cdr x))
(define (print-rat x)
(newline)
(display (numer x))
(display "/")
(display (denom x)))
(define (add-rat x y)
(make-rat (+ (* (numer x) (denom y))
(* (numer y) (denom x)))
(* (denom x) (denom y))))
(define (sub-rat x y)
(make-rat (- (* (numer x) (denom y))
(* (numer y) (denom x)))
(* (denom x) (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))))
(define (gcd a b)
(if (= b 0)
a
(gcd b (remainder a b))))
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
;; exercise 2.1
(define (make-rat n d)
(cond
((and (> n 0) (> d 0)) (cons n d))
((and (> n 0) (<= d 0)) (cons (- n) (- d)))
(else (cons (- n) (- d)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 2.1.2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (make-rat n d)
(cons n d))
(define (numer x)
(let ((g (gcd (car x) (cdr x))))
(/ (car x) g)))
(define (denom x)
(let ((g (gcd (car x) (cdr x))))
(/ (cdr x) g)))
(define hoge (make-rat 2 6))
(numer hoge)
(denom hoge)
;; exercise 2.2 start
(define (make-segment start end)
(cons start end))
(define (start-segment segment)
(car segment))
(define (end-segment segment)
(cdr segment))
(define (make-point x y)
(cons x y))
(define (x-point point)
(car point))
(define (y-point point)
(cdr point))
(define (print-point p)
(newline)
(display "(")
(display (x-point p))
(display ",")
(display (y-point p))
(display ")")
(newline))
(define (midpoint-segment segment)
(print-point (make-point (/ (+ (x-point (start-segment segment))
(x-point (end-segment segment)))
2.0)
(/ (+ (y-point (start-segment segment))
(y-point (end-segment segment)))
2.0))))
(define point1 (make-point 10 20))
(define point2 (make-point 30 40))
(define segment1 (make-segment point1 point2))
(midpoint-segment segment1)
;; exercise 2.2 end
;; exercise 2.3 start
;; point ver
(define (make-rectangle bottom-left top-right)
(cons bottom-left top-right))
(define (bottom-left rectangle)
(car rectangle))
(define (top-right rectangle)
(cdr rectangle))
(define (x-distance rectangle)
(abs (- (x-point (top-right rectangle)) (x-point (bottom-left rectangle)))))
(define (y-distance rectangle)
(abs (- (y-point (top-right rectangle)) (y-point (bottom-left rectangle)))))
(define (perimeter rectangle)
(* 2.0
(+ (x-distance rectangle)
(y-distance rectangle))))
(define (area rectangle)
(* (x-distance rectangle)
(y-distance rectangle)))
(define rectangle1 (make-rectangle
(make-point 10 20)
(make-point 30 40)))
(perimeter rectangle1)
(area rectangle1)
;; segment ver
(define (make-rectangle first-point second-point)
(make-segment first-point second-point))
(define (x-distance rectangle)
(abs (- (x-point (end-segment rectangle))
(x-point (start-segment rectangle)))))
(define (y-distance rectangle)
(abs (- (y-point (end-segment rectangle))
(y-point (start-segment rectangle)))))
(define rectangle1 (make-rectangle
(make-point 10 20)
(make-point 30 40)))
(perimeter rectangle1)
(area rectangle1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment