;; 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 mlist) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) ; Schnittstelle für veränderbare Listen: (provide mlist-of mcons mcons? mfirst mrest set-mfirst! set-mrest!) ; Eine veränderbare nicht-leere Liste besteht aus ; - einem veränderbaren Element ; - einer veränderbaren Restliste (define-record-procedures-parametric-2 ne-mlist ne-mlist-of mcons mcons? ((mfirst set-mfirst!) (mrest set-mrest!))) ; Eine veränderbare Liste ist eins der folgenden: ; - eine leere Liste ; - eine veränderbare nicht-leere Liste (define mlist-of (lambda (sig) (signature (mixed empty-list (ne-mlist-of sig (mlist-of sig)))))) ; Signaturvereinbarungen für Listenoperationen: (: mcons (%a (mlist-of %a) -> (ne-mlist-of %a (mlist-of %a)))) (: mcons? (any -> boolean)) (: mfirst ((ne-mlist-of %a (mlist-of %a)) -> %a)) (: set-mfirst! ((ne-mlist-of %a (mlist-of %a)) %a -> unspecific)) (: mrest ((ne-mlist-of %a (mlist-of %a)) -> (mlist-of %a))) (: set-mrest! ((ne-mlist-of %a (mlist-of %a)) (mlist-of %a) -> unspecific)) ; Umwandlungsprozedur von veränderbaren Listen in Standardlisten (: mlist->list ((mlist-of %a) -> (list-of %a))) (define mlist->list (lambda (xs) (if (empty? xs) empty (cons (mfirst xs) (mlist->list (mrest xs)))))) (: l1 (mlist-of natural)) (define l1 (mcons 1 (mcons 2 empty))) (: l1d (mlist-of any)) (define l1d (mcons l1 l1)) (: l1e (mlist-of any)) (define l1e (mcons (mcons 1 (mcons 2 empty)) (mcons 1 (mcons 2 empty)))) ; Mutatur für Listen mit einer Liste als erstes Element: ; ändere des erste Element der ersten Elementliste zu 9 (define set-ff-9! (lambda (xs) (begin (set-mfirst! (mfirst xs) 9) xs)))