;               D E   M A N I A K A L E   M O B I E L
;               -------------------------------------
;
;Eerst definieren van de interface :
;  constructor
;    (maak-mobiel l1 w1 l2 w2)
;  selector
;    (linkerlengte mobiel)
;    (rechterlengte mobiel)
;    (rechterhangsel mobiel)
;    (linkerhangsel mobiel)
;      linkerHANGSEL slaat op het feit dat het hangsel geen gewicht moet zijn
;      maar ook een andere mobiel kan zijn.
;      om uit te maken of het aanhangsel nu een mobiel is of een gewicht
;      moet er een functie ismobiel geschreven worden
;    (mobiel? mobiel)
;
;dan nu even denken over een voorstellingswijze :
;Elke mobiel bestaat zeker uit 4 zaken (l1, w1, l2 & w2)...
;Deze 4 zaken kunnen bijgehouden worden in een lijst maar ik geef er de
;voorkeur aan om 3 cons-cellen te gebruiken. (Door cons-cellen te gebruiken
;bereik ik rapper het gevraagde)
;
;          -------
;         |   |   |     (nee dit is geen UFO, dit is een cons-cel)
;          -|---|-
;           |   |
;     /-----/   \----\
;     |              |
;     V              V
;   ---------      ---------
;  | l1 | w1 |    | l2 | w2 |
;   ---------      ---------
;
;
;
;En dan nu de implementatie...
(define (make-mobile l1 w1 l2 w2)
  (cons (cons l1 w1)
        (cons l2 w2)))
(define (linkerlengte mobiel)
  ;veiliger is hier een foutcontrole te steken, maar dat is niet gevraagd
  (caar mobiel))
(define (rechterlengte mobiel)
  (cadr mobiel))
(define (linkerhangsel mobiel)
  (cdar mobiel))
(define (rechterhangsel mobiel)
  (cddr mobiel))
(define (mobiel? mobiel)
  (if (pair? mobiel)
      #t
      #f))
;nu deze geschreven zijn kan ik aan de gevraagde functies beginnen
;ten eerste de mobile-weight?
(define (mobile-weight mobiel)
  (if (mobiel? mobiel)
      ;als men een ECHTE mobiel vast heeft dan telt men de gewichten van de
      ;linkermobiel op bij de gewichten van de rechtermobiel...
      (+ (mobile-weight (linkerhangsel mobiel))
                        (mobile-weight (rechterhangsel mobiel)))
      ;als het mobiel geen mobiel is wordt er veronderstelt dat men
      ;het gewicht vast heeft...
      mobiel))
;ten tweede : de balanced?
(define (balanced? mobiel)
  ;een mobiel is gebalenceerd als
  ;       het linkergewicht . l1 = rechtergewicht . l2
  ;   EN  het linkerhangsel gebalanceerd is
  ;   EN  het rechterhangsel gebalanceerd is
  ;als balanced wordt opgeroepen op een gewicht wordt #t weergegeven
  (if (mobiel? mobiel)
      (AND (= (* (mobile-weight (linkerhangsel mobiel)) (linkerlengte mobiel))
              (* (mobile-weight (rechterhangsel mobiel)) (rechterlengte mobiel)))
           (balanced? (linkerhangsel mobiel))
           (balanced? (rechterhangsel mobiel)))
      #t))