;; 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-beginner-reader.ss" "deinprogramm")((modname morecookies) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #f #t none explicit #f ()))) (: simple-choc chocolate-cookie) (define simple-choc (make-chocolate-cookie 10 12)) (define double-choc (make-chocolate-cookie 20 12)) ; Gewicht eines Schokokekses bestimmten (: chocolate-cookie-weight (chocolate-cookie -> real)) (check-expect (chocolate-cookie-weight simple-choc) 22) (check-expect (chocolate-cookie-weight double-choc) 32) #;(define chocolate-cookie-weight (lambda (c) ...(chocolate-cookie-chocolate c) ...(chocolate-cookie-cookie c) ...)) (define chocolate-cookie-weight (lambda (c) (+ (chocolate-cookie-chocolate c) (chocolate-cookie-cookie c)))) ; Aus einem Keks einen neuen mit doppelt so hohem Schokoladenanteil erzeugen (: double-chocolate-in-cookie (chocolate-cookie -> chocolate-cookie)) (check-expect (double-chocolate-in-cookie simple-choc) double-choc) #;(define double-chocolate-in-cookie (lambda (c) ...(chocolate-cookie-chocolate c) ...(chocolate-cookie-cookie c) ...)) ; Ergebnis ist Cookie, daher Konstruktor: #;(define double-chocolate-in-cookie (lambda (c) (make-chocolate-cookie ...(chocolate-cookie-chocolate c) ...(chocolate-cookie-cookie c) ...))) ; geschickte Kombination: (define double-chocolate-in-cookie (lambda (c) (make-chocolate-cookie (* 2 (chocolate-cookie-chocolate c)) (chocolate-cookie-cookie c)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Ein Marmelade-Creme-Keks besteht aus ; - einem Marmeladen-Anteil (real) ; - einem Creme-Anteil (real) ; - einem Keks-Anteil (real) (define-record-procedures jelly-cream-cookie make-jelly-cream-cookie jelly-cream-cookie? (jelly-cream-cookie-jelly jelly-cream-cookie-cream jelly-cream-cookie-cookie)) (: make-jelly-cream-cookie (real real real -> jelly-cream-cookie)) (: jelly-cream-cookie? (any -> boolean)) (: jelly-cream-cookie-jelly (jelly-cream-cookie -> real)) (: jelly-cream-cookie-cream (jelly-cream-cookie -> real)) (: jelly-cream-cookie-cookie (jelly-cream-cookie -> real)) (define simple-jelly-cream (make-jelly-cream-cookie 10 10 12)) (define double-jelly-cream (make-jelly-cream-cookie 15 20 12)) ; Gewicht eines Marmeladen-Creme-Kekses bestimmen (: jelly-cream-cookie-weight (jelly-cream-cookie -> real)) (check-expect (jelly-cream-cookie-weight simple-jelly-cream) 32) (check-expect (jelly-cream-cookie-weight double-jelly-cream) 47) #;(define jelly-cream-cookie-weight (lambda (c) ...)) #;(define jelly-cream-cookie-weight (lambda (c) ...(jelly-cream-cookie-jelly c) ...(jelly-cream-cookie-cream c) ...(jelly-cream-cookie-cookie c))) (define jelly-cream-cookie-weight (lambda (c) (+ (jelly-cream-cookie-jelly c) (jelly-cream-cookie-cream c) (jelly-cream-cookie-cookie c)))) ; Kekse als eine Einheit: gemischte Daten! ; Ein Keks ist eins der folgenden: ; - ein Schokokeks (chocolate-cookie) ; - ein Marmeladen-Creme-Keks (jelly-cream-cookie) ; Name: cookie (define cookie (signature (mixed chocolate-cookie jelly-cream-cookie))) ;(define onetwothree (signature (one-of 1 2 3))) ; Gewicht eines Kekses bestimmen (: cookie-weight (cookie -> real)) (check-expect (cookie-weight simple-choc) 22) (check-expect (cookie-weight double-choc) 32) (check-expect (cookie-weight simple-jelly-cream) 32) (check-expect (cookie-weight double-jelly-cream) 47) #;(define cookie-weight (lambda (c) ...)) ; Fallunterscheidung weil zwei Arten von Eingabedaten: #;(define cookie-weight (lambda (c) (cond (... ...) (... ...)))) ; Setze "Signaturprädikate" in die Alternativen ein: #;(define cookie-weight (lambda (c) (cond ((chocolate-cookie? c) ...) ((jelly-cream-cookie? c) ...)))) (define cookie-weight (lambda (c) (cond ((chocolate-cookie? c) (chocolate-cookie-weight c)) ((jelly-cream-cookie? c) (jelly-cream-cookie-weight c)))))