2011-01-05 9 views
1

Ich arbeite durch Exercise 21.2.3 von HtDP auf eigene Faust und fragte mich, ob dies idiomatische Nutzung der verschiedenen Funktionen ist. Das ist, was ich habe, so weit:Idiomatische Verwendung von Filter-, Karten-, Build-Listen- und lokalen Funktionen in Racket/Scheme?

(define-struct ir (name price)) 
(define list-of-toys (list 
         (make-ir 'doll 10) 
         (make-ir 'robot 15) 
         (make-ir 'ty 21) 
         (make-ir 'cube 9))) 

;; helper function 
(define (price< p toy) 
    (cond 
    [(< (ir-price toy) p) toy] 
    [else empty])) 

(define (eliminate-exp ua lot) 
    (cond 
    [(empty? lot) empty] 
    [else 
    (filter ir? (map price< (build-list (length lot) 
             (local ((define (f x) ua)) f)) lot))])) 

Um meine Anfänger Augen, die ziemlich hässlich scheint, weil ich eine lokale Funktion definieren, müssen zu erhalten build-list, zu arbeiten, da map zwei Listen gleicher Länge erfordert. Kann dies zur besseren Lesbarkeit verbessert werden? Vielen Dank.

Antwort

3

Sie eliminate-exp mit filter allein umsetzen könnte:

(define (eliminate-exp ua lot) 
    (define (price< toy) (< (ir-price toy) ua)) 
    (filter price< lot)) 
+0

Danke für die Beantwortung. Es scheint, dass Lambda in diesem Fall nützlich ist, aber HtDP führt es erst später im Curriculum ein (Abschnitt 24). – Greenhorn

+0

@Greenhorn Ich habe die Antwort aktualisiert, so dass sie nicht direkt das 'Lambda'-Formular verwendet. –

+0

das ist eine gute Antwort, danke. Es ist viel eleganter, aber ich muss die erweiterten Funktionen von Racket aktivieren, damit Ihr Beispiel funktioniert. Interessanterweise wird 'filter' zuerst aufgerufen, dann' map', während in meinem Beispiel die Reihenfolge umgekehrt ist. Ich werde daraus lernen. – Greenhorn

1

Ich weiß nicht, was Build-Liste ist oder tut, aber sicher können Sie einfach tun:

(lambda (x) ua) 

statt:

(local ((define (f x) ua)) f) 
Verwandte Themen