Идиоматическое использование фильтра, карты, build-list и локальных функций в Racket / Scheme? - PullRequest
1 голос
/ 05 января 2011

Я работаю через Упражнение 21.2.3 по HtDP самостоятельно, и мне было интересно, не является ли это идиоматическим использованием различных функций. Это то, что я до сих пор:

(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))]))

На мой взгляд начинающим, это кажется довольно уродливым, потому что я должен определить локальную функцию, чтобы заставить build-list работать, так как map требует двух списков одинаковой длины. Можно ли это улучшить для удобства чтения? Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Вы можете реализовать eliminate-exp только с filter:

(define (eliminate-exp ua lot)
  (define (price< toy) (< (ir-price toy) ua))
  (filter price< lot))
1 голос
/ 05 января 2011

Я не знаю, что такое build-list или что делает, но наверняка вы можете просто сделать:

(lambda (x) ua)

вместо:

(local ((define (f x) ua)) f)
...