#+TITLE: Zapiski in vaje #6 srečanja programerskega bralnega krožka SICP #+AUTHOR: Jurij #+OPTIONS: toc:nil num:nil author * Teme ** Grajenje abstrakcij s podatki Prvo poglavje, v katerem smo operirali s preprostimi števili, drugo poglavje nadgrajuje s podatkovnimi struktura oz. kombiniranjem podatkovnih objektov v sestavljene podatkovne modele. Torej ustvarili bomo podatkovne abstrakcije in definirali funkcije ki lahko operirajo nad njimi. Preprost primer je recimo racionalno število, ki ga sestavlja par števca in imenovalca. #+begin_src scheme (define (ustvari-rac s i) (cons s i)) (define (stevec x) (car x)) (define (imenovalec x) (cdr x)) (define (izpisi-rac x) (newline) (display (stevec x)) (display "/") (display (imenovalec x))) (define polovica (ustvari-rac 1 2)) (izpisi-rac polovica) (izpisi-rac (ustvari-rac 6 3)) #+end_src Uporabimo funkcijo za najvecji skupni imenovlec, da poenostavimo recimo 6/3 v 2/1. #+begin_src scheme (define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) (define (ustvari-rac s i) (let ((g (gcd s i))) (cons (/ s g) (/ i g)))) (izpisi-rac (ustvari-rac 6 3)) #+end_src * vaje ** 2.1 bolji ustvari-rac #+begin_src scheme (define (ustvari-rac s i) (cons (if (< i 0) (* -1 s) s) (abs i))) #+end_src ** 2.2 polovica daljice #+begin_src scheme (define make-point cons) (define x-point car) (define y-point cdr) (define make-segment cons) (define (print-point p) (newline) (display "(") (display (x-point p)) (display ",") (display (y-point p)) (display ")")) (define (avg a b) (/ (+ a b) 2)) (define start-segment car) (define end-segment cdr) (define (midpoint-segment s) (let ((start (start-segment s)) (end (end-segment s))) (make-point (avg (x-point start) (x-point end)) (avg (y-point start) (y-point end))))) #+end_src ** 3.3 obseg in ploscina kvadra #+begin_src scheme #+end_src