我正在自己研究HtDP的Exercise 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
需要两个相等长度的列表。这是否可以提高可读性?谢谢。
答案 0 :(得分:3)
您可以单独使用eliminate-exp
实施filter
:
(define (eliminate-exp ua lot)
(define (price< toy) (< (ir-price toy) ua))
(filter price< lot))
答案 1 :(得分:1)
我不知道build-list是什么或者做什么,但你肯定可以这样做:
(lambda (x) ua)
而不是:
(local ((define (f x) ua)) f)