;; Die ersten drei Zeilen dieser Datei wurden von DrRacket eingefügt. Sie enthalten Metadaten ;; über die Sprachebene dieser Datei in einer Form, die DrRacket verarbeiten kann. #reader(lib "DMdA-assignments-reader.ss" "deinprogramm")((modname mutable-list) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) ; Definiere veränderbare Listen durch Nachrichtenweitergabe (define mcons (lambda (x y) (lambda (msg) (cond ((equal? msg "first" ) x) ((equal? msg "rest" ) y) ((equal? msg "set-first!") (lambda (e) (set! x e))) ((equal? msg "set-rest!" ) (lambda (r) (set! y r))))))) (define mfirst (lambda (xs) (xs "first"))) (define mrest (lambda (xs) (xs "rest"))) (define set-mfirst! (lambda (xs e) ((xs "set-first!") e))) (define set-mrest! (lambda (xs r) ((xs "set-rest!") r))) ; Umwandlungsprozedur von veränderbaren Listen in Standardlisten (define mlist->list (lambda (xs) (if (empty? xs) empty (cons (mfirst xs) (mlist->list (mrest xs)))))) (define l1 (mcons 1 (mcons 2 empty))) (define l2 (mcons 3 (mcons 4 empty))) ; Eine Liste an einer andere anhängen (im Gegensatz zu concatenate hier Seiteneffekt!) ; Zunächst: finde das letzte mcons einer veränderbaren Liste: (define last-mcons (lambda (xs) (if (empty? (mrest xs)) xs (last-mcons (mrest xs))))) (define append! (lambda (xs ys) (begin (set-mrest! (last-mcons xs) ys) xs)))