exercise-2.03-rectangles.rkt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #lang racket
  2. (define (Mb-to-B n) (* n 1024 1024))
  3. (define MAX-BYTES (Mb-to-B 64))
  4. (custodian-limit-memory (current-custodian) MAX-BYTES)
  5. (define (average a b)
  6. (/ (+ a b) 2))
  7. (define (make-point x y)
  8. (cons x y))
  9. (define (x-of-point A)
  10. (car A))
  11. (define (y-of-point A)
  12. (cdr A))
  13. (define (make-segment A B)
  14. (cons A B))
  15. (define (start-segment s)
  16. (car s))
  17. (define (end-segment s)
  18. (cdr s))
  19. (define (midpoint s)
  20. (let
  21. ((x1 (x-of-point (start-segment s)))
  22. (y1 (y-of-point (start-segment s)))
  23. (x2 (x-of-point (end-segment s)))
  24. (y2 (y-of-point (end-segment s))))
  25. (make-point
  26. (average x1 x2)
  27. (average y1 y2))))
  28. (define (print-point P)
  29. (display "(")
  30. (display (x-of-point P))
  31. (display "|")
  32. (display (y-of-point P))
  33. (display ")")
  34. (newline))
  35. (define (print-segment seg)
  36. (print-point (start-segment seg))
  37. (print-point (end-segment seg)))
  38. (define (square x)
  39. (* x x))
  40. (define (absdiff a b)
  41. (abs (- a b)))
  42. (define (seg-length seg)
  43. (let
  44. ((start (start-segment seg))
  45. (end (end-segment seg)))
  46. (let
  47. ((a (absdiff (x-of-point start) (x-of-point end)))
  48. (b (absdiff (y-of-point start) (y-of-point end))))
  49. (sqrt (+ (square a) (square b))))))
  50. (define (perimeter rect)
  51. (+
  52. (seg-length (upper-side rect))
  53. (seg-length (right-side rect))
  54. (seg-length (bottom-side rect))
  55. (seg-length (left-side rect))))
  56. (define (area rect)
  57. (*
  58. (seg-length (upper-side rect))
  59. (seg-length (left-side rect))))
  60. ; Here start the procedures depending on how the rectangle's representation is implemented.
  61. ; They represent the abstraction barrier as far as I understand.
  62. ; Representation 1
  63. ;(define (upper-side rect)
  64. ; (make-segment
  65. ; (make-point
  66. ; (x-of-point (car rect))
  67. ; (y-of-point (cdr rect)))
  68. ; (cdr rect)))
  69. ;
  70. ;(define (right-side rect)
  71. ; (make-segment
  72. ; (cdr rect)
  73. ; (make-point
  74. ; (x-of-point (cdr rect))
  75. ; (y-of-point (car rect)))))
  76. ;
  77. ;(define (bottom-side rect)
  78. ; (make-segment
  79. ; (car rect)
  80. ; (make-point
  81. ; (x-of-point (cdr rect))
  82. ; (y-of-point (car rect)))))
  83. ;
  84. ;(define (left-side rect)
  85. ; (make-segment
  86. ; (make-point
  87. ; (x-of-point (car rect))
  88. ; (y-of-point (cdr rect)))
  89. ; (car rect)))
  90. ;
  91. ;; This representation uses 2 corners on a diagonal.
  92. ;(define (make-rect lower-left-corner upper-right-corner)
  93. ; (cons lower-left-corner upper-right-corner))
  94. ; Representation 2
  95. ; convenience procedures
  96. (define (upper-left-corner rect)
  97. (car rect))
  98. (define (upper-right-corner rect)
  99. (car (cdr rect)))
  100. (define (bottom-right-corner rect)
  101. (car (cdr (cdr rect))))
  102. (define (bottom-left-corner rect)
  103. (cdr (cdr (cdr rect))))
  104. ; changed procedures
  105. (define (upper-side rect)
  106. (make-segment
  107. (upper-left-corner rect)
  108. (upper-right-corner rect)))
  109. (define (right-side rect)
  110. (make-segment
  111. (upper-right-corner rect)
  112. (bottom-right-corner rect)))
  113. (define (bottom-side rect)
  114. (make-segment
  115. (bottom-right-corner rect)
  116. (bottom-left-corner rect)))
  117. (define (left-side rect)
  118. (make-segment
  119. (bottom-left-corner rect)
  120. (upper-left-corner rect)))
  121. ; This representation uses 4 corners in a linked list.
  122. (define (make-rect upper-left upper-right lower-right lower-left)
  123. (cons upper-left
  124. (cons upper-right
  125. (cons lower-right lower-left))))
  126. ; test procedures
  127. ;(define (test rect)
  128. ; (display "upper side:") (newline)
  129. ; (print-segment (upper-side rect))
  130. ; (display "right side:") (newline)
  131. ; (print-segment (right-side rect))
  132. ; (display "bottom side:") (newline)
  133. ; (print-segment (bottom-side rect))
  134. ; (display "left side:") (newline)
  135. ; (print-segment (left-side rect))
  136. ;
  137. ; (display "length upper side: ")
  138. ; (display (seg-length (upper-side rect))) (newline)
  139. ; (display "length right side: ")
  140. ; (display (seg-length (right-side rect))) (newline)
  141. ; (display "length bottom side: ")
  142. ; (display (seg-length (bottom-side rect))) (newline)
  143. ; (display "length left side: ")
  144. ; (display (seg-length (left-side rect))) (newline)
  145. ;
  146. ; (display "area: ")
  147. ; (display (area rect)) (display " AU") (newline)
  148. ;
  149. ; (display "perimeter: ")
  150. ; (display (perimeter rect)) (display " LU"))
  151. ;
  152. ;(test
  153. ; (make-rect
  154. ; (make-point 1.0 1.0)
  155. ; (make-point 3.0 6.0)))
  156. (define (test rect)
  157. (display "upper side:") (newline)
  158. (print-segment (upper-side rect))
  159. (display "right side:") (newline)
  160. (print-segment (right-side rect))
  161. (display "bottom side:") (newline)
  162. (print-segment (bottom-side rect))
  163. (display "left side:") (newline)
  164. (print-segment (left-side rect))
  165. (display "length upper side: ")
  166. (display (seg-length (upper-side rect))) (newline)
  167. (display "length right side: ")
  168. (display (seg-length (right-side rect))) (newline)
  169. (display "length bottom side: ")
  170. (display (seg-length (bottom-side rect))) (newline)
  171. (display "length left side: ")
  172. (display (seg-length (left-side rect))) (newline)
  173. (display "area: ")
  174. (display (area rect)) (display " AU") (newline)
  175. (display "perimeter: ")
  176. (display (perimeter rect)) (display " LU"))
  177. (test
  178. (make-rect
  179. (make-point 1.0 3.0)
  180. (make-point 3.0 3.0)
  181. (make-point 3.0 1.0)
  182. (make-point 1.0 1.0)))
  183. ; The procedures `area` and `perimeter` have not changed, although the representation of the square changed.