过滤器、映射、构建列表和本地函数在Racket/Scheme中的惯用用法?

过滤器、映射、构建列表和本地函数在Racket/Scheme中的惯用用法?,scheme,racket,htdp,Scheme,Racket,Htdp,我正在自己研究HtDP的用法,想知道这是否是各种函数的惯用用法。这就是我到目前为止所做的: (define-struct ir (name price)) (define list-of-toys (list (make-ir 'doll 10) (make-ir 'robot 15) (make-ir 'ty 21) (

我正在自己研究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))]))
(定义结构ir(名称价格))
(定义玩具清单(清单
(制作ir'娃娃10)
(制作ir'机器人15)
(第21条)
(制作ir‘cube 9)))
;; 辅助函数
(定义(价格

对于我的新手来说,这看起来很难看,因为我必须定义一个本地函数才能使
构建列表
工作,因为
映射
需要两个长度相等的列表。是否可以提高可读性?谢谢。

我不知道构建列表是什么或是做什么的,但您肯定可以这样做:

(lambda (x) ua)
而不是:

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

我不知道构建列表是什么或做什么,但您肯定可以这样做:

(lambda (x) ua)
而不是:

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

您可以单独使用
过滤器
来实现
消除exp

(define (eliminate-exp ua lot)
  (define (price< toy) (< (ir-price toy) ua))
  (filter price< lot))
(定义(消除扩展ua批次)
(定义(价格<玩具)(<(ir价格玩具)ua))
(过滤价格<批次))

您可以单独使用
过滤器实现
消除exp

(define (eliminate-exp ua lot)
  (define (price< toy) (< (ir-price toy) ua))
  (filter price< lot))
(定义(消除扩展ua批次)
(定义(价格<玩具)(<(ir价格玩具)ua))
(过滤价格<批次))

谢谢您的回答。在这种情况下,lambda似乎很有用,但HtDP直到课程的后面(第24节)才引入它。@Greenhorn我更新了答案,这样它就不会直接使用
lambda
表单。这是一个很好的答案,谢谢。它更优雅,但我需要打开Racket上的高级功能,让您的示例工作。有趣的是,
filter
首先被调用,然后被调用
map
,而在我的示例中,顺序是相反的。我将从中学习。在你被允许使用lambda之后,我想你会发现这是最惯用的方法。很常见的情况是,
filter'或
map'采用仅用于此目的的一次性程序。在这种情况下,使用lambda将其定义为一个匿名函数,而不是在别处使用名称来定义它,这非常方便,而且可读。我之前的评论是@Greenhorn。谢谢你的回答。在这种情况下,lambda似乎很有用,但HtDP直到课程的后面(第24节)才引入它。@Greenhorn我更新了答案,这样它就不会直接使用
lambda
表单。这是一个很好的答案,谢谢。它更优雅,但我需要打开Racket上的高级功能,让您的示例工作。有趣的是,
filter
首先被调用,然后被调用
map
,而在我的示例中,顺序是相反的。我将从中学习。在你被允许使用lambda之后,我想你会发现这是最惯用的方法。很常见的情况是,
filter'或
map'采用仅用于此目的的一次性程序。在这种情况下,使用lambda将其定义为一个匿名函数,而不是在别处使用名称来定义它,这非常方便,而且可读。我之前的评论是@Greenhorn。