;; 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-with-message) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) ; Veränderbare Listen durch Nachrichtenweitergabe (define mcons (lambda (x y) (lambda (m) (cond ((equal? m "first") x) ((equal? m "rest" ) y) ((equal? m "set-mfirst!") (lambda (v) (set! x v))) ((equal? m "set-mrest!" ) (lambda (v) (set! y v))))))) (define mfirst (lambda (xs) (xs "first"))) (define mrest (lambda (xs) (xs "rest"))) (define set-mfirst! (lambda (xs e) ((xs "set-mfirst!") e))) (define set-mrest! (lambda (xs r) ((xs "set-mrest!") r))) ; Umwandlung veränderbare Listen -> "normale" Listen (define mlist->list (lambda (xs) (if (empty? xs) xs (cons (mfirst xs) (mlist->list (mrest xs)))))) (define mylist (mcons 1 (mcons 2 empty))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Anhängen durch verändern der ersten Liste ; Letztes mcons in einer Liste finden: (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))) (define l1 (mcons 1 (mcons 2 empty))) (define l2 (mcons 3 (mcons 4 empty)))