Added my solutions so far
This commit is contained in:
		
							
								
								
									
										93
									
								
								ex-2.1-thru-2.6
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								ex-2.1-thru-2.6
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#lang racket
 | 
			
		||||
 | 
			
		||||
;; 2.1
 | 
			
		||||
(define (normalize n d)
 | 
			
		||||
  (if (equal? (< n 0) (< d 0))
 | 
			
		||||
      (cons (abs n) (abs d))
 | 
			
		||||
      (cons (- (abs n)) (abs d))))
 | 
			
		||||
(define (make-rat n d)
 | 
			
		||||
  (let ([g (gcd n d)])
 | 
			
		||||
    ; if they have the same sign, just take absolutes
 | 
			
		||||
    (normalize (/ n g) (/ d g))))
 | 
			
		||||
 | 
			
		||||
(define (print-rat rat)
 | 
			
		||||
  (display (car rat))
 | 
			
		||||
  (display "/")
 | 
			
		||||
  (display (cdr rat))
 | 
			
		||||
  (newline))
 | 
			
		||||
 | 
			
		||||
(map print-rat
 | 
			
		||||
     (map (λ (x) (apply make-rat x))
 | 
			
		||||
          '((2 3)
 | 
			
		||||
            (1 2)
 | 
			
		||||
            (-3 4)
 | 
			
		||||
            (-100 -4)
 | 
			
		||||
            (100 -4))))
 | 
			
		||||
 | 
			
		||||
;; 2.2
 | 
			
		||||
;; we are using racket, so we could also define a structure.
 | 
			
		||||
;; (struct point (x y))
 | 
			
		||||
;; instead we'll keep to the book and use cons cells.
 | 
			
		||||
(define point-x car)
 | 
			
		||||
(define point-y cdr)
 | 
			
		||||
(define point cons)
 | 
			
		||||
;; the above could be replaced with
 | 
			
		||||
; (struct point (x y))
 | 
			
		||||
(define line-p1 car)
 | 
			
		||||
(define line-p2 cdr)
 | 
			
		||||
(define line cons)
 | 
			
		||||
; (struct line (p1 p2))
 | 
			
		||||
 | 
			
		||||
(define (average a b) (/ (+ a b) 2))
 | 
			
		||||
(define (midpoint-segment ls)
 | 
			
		||||
  (point (average (point-x (line-p1 ls))
 | 
			
		||||
                  (point-x (line-p2 ls)))
 | 
			
		||||
         (average (point-y (line-p1 ls))
 | 
			
		||||
                  (point-y (line-p2 ls)))))
 | 
			
		||||
 | 
			
		||||
;; 2.3
 | 
			
		||||
;; not sure what the book means here. But I guess we can implement
 | 
			
		||||
;; rectangles as pairs, too, since we only need two corners really.
 | 
			
		||||
;; as "another representation", I guess we could store two line segments?
 | 
			
		||||
;; but either way the rect-p1 and rect-p2
 | 
			
		||||
;; functions can be replaced very easily.
 | 
			
		||||
;; the area and perimeter functions do not care about their implementation.
 | 
			
		||||
(define rect-p1 car)
 | 
			
		||||
(define rect-p2 cdr)
 | 
			
		||||
(define rect cons)
 | 
			
		||||
 | 
			
		||||
;; further abstraction, actually: rectangle side 1.
 | 
			
		||||
;; returns the length of rect's one side
 | 
			
		||||
(define (rect-side-helper rect fun)
 | 
			
		||||
  (abs (- (fun (rect-p1 rect))
 | 
			
		||||
          (fun (rect-p2 rect)))))
 | 
			
		||||
(define (rect-s1 rect)
 | 
			
		||||
  (rect-side-helper rect point-x))
 | 
			
		||||
(define (rect-s2 rect)
 | 
			
		||||
  (rect-side-helper rect point-y))
 | 
			
		||||
 | 
			
		||||
(define (area rect)
 | 
			
		||||
  (* (rect-s1 rect) (rect-s2 rect)))
 | 
			
		||||
(define (perimeter rect)
 | 
			
		||||
  (* 2 (+ (rect-s1 rect) (rect-s2 rect))))
 | 
			
		||||
 | 
			
		||||
; 2.6
 | 
			
		||||
(define zero (lambda (f) (lambda (x) x)))
 | 
			
		||||
(define (add-1 n)
 | 
			
		||||
  (lambda (f) (lambda (x) (f ((n f) x)))))
 | 
			
		||||
(define one (λ (f) (λ (x) (f x)))) ;; applies f once.
 | 
			
		||||
(define two (λ (f) (λ (x) (f (f x)))))
 | 
			
		||||
;(add-1 zero) ; is the same as
 | 
			
		||||
;(lambda (f) (lambda (x) (f ((zero f) x))))
 | 
			
		||||
;(lambda (f) (lambda (x) ((add-1 zero) (((add-1 zero) f) x))))
 | 
			
		||||
 | 
			
		||||
(define (addition n1 n2)
 | 
			
		||||
  "Returns a function that takes a function f, returns:
 | 
			
		||||
    A function that takes a parameter x, applies f to x n1 + n2 times
 | 
			
		||||
    (n1 and n2 being church numerals, i.e. λfλx forms.)"
 | 
			
		||||
  (lambda (f) (lambda (x)
 | 
			
		||||
                ((n2 f) ((n1 f) x))
 | 
			
		||||
                )))
 | 
			
		||||
 | 
			
		||||
(define (de-churchify n)
 | 
			
		||||
  ((n (λ (x) (+ x 1))) 0))
 | 
			
		||||
		Reference in New Issue
	
	Block a user