1

我正在自己完成HtDP的练习 21.2.3 并且想知道这是否是各种功能的惯用用法。这是我到目前为止所拥有的:

(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需要两个长度相等的列表。这可以提高可读性吗?谢谢你。

4

2 回答 2

3

您可以eliminate-exp单独filter实现:

(define (eliminate-exp ua lot)
  (define (price< toy) (< (ir-price toy) ua))
  (filter price< lot))
于 2011-01-05T05:30:12.470 回答
1

我不知道 build-list 是什么或做什么,但你肯定可以这样做:

(lambda (x) ua)

代替:

(local ((define (f x) ua)) f)
于 2011-01-05T04:47:38.807 回答