; Die Prozedur COMPOSE erwartet als Argument eine einstellige Funktion f.
; Wert von COMPOSE ist eine zweistellige Funktion, deren erstes Argument n
; angibt, wie oft f auf x Angewendet wird.

(define (compose f)
  (define (dispatch n x)
    (do-compose f n x))
  (define (do-compose f n x)
    (cond ((zero? n) x)                         ; n=0, identische Abbildung
          (else (do-compose f (-1+ n) (f x))))) ; sonst n-fache Verkettung
                                                ; von f und Anwendung auf x.
  dispatch) ; Rckgabe der Prozedur DISPATCH

; Beispiel:
;
; (define (nth-element n l)
;   (invariant (> n 0)) ; n mu grer als 0 sein.
;   (car ((compose cdr) (-1+ n) l)))          -->nth-element
; (define a '(a b c d e))               -->a
; (nth-element 1)                       -->a
; (nth-element 5)                       -->e
; (nth-element 6)                       -->"ERROR"
; (nth-element 0)                       -->"ERROR" ; Invariant doesn't match


