Struct Racket:如何在结构列表中的结构字段上应用筛选器

Struct Racket:如何在结构列表中的结构字段上应用筛选器,struct,lambda,filter,racket,Struct,Lambda,Filter,Racket,我的任务是编写一个函数inYear,它取一个名为year的数字和一个事件结构列表,并生成一个新的列表,其中每个元素都是一个在年中发生的事件结构。我在过滤器中找到并尝试定义lambda函数。请参阅下面的我的事件定义/列表、函数和测试。测试失败,没有筛选出任何元素,它只返回原始列表。我做错了什么 (struct event (name day month year xlocation ylocation) #:transparent) (define e1 (event "new yea

我的任务是编写一个函数inYear,它取一个名为year的数字和一个事件结构列表,并生成一个新的列表,其中每个元素都是一个在年中发生的事件结构。我在过滤器中找到并尝试定义lambda函数。请参阅下面的我的事件定义/列表、函数和测试。测试失败,没有筛选出任何元素,它只返回原始列表。我做错了什么

(struct event (name day month year xlocation ylocation) #:transparent)

(define e1 (event "new years" 1 "Jan" 2021 0 0))
(define e2 (event "valentines" 14 "Feb" 2021 2 2))
(define e3 (event "my birthday" 6 "Mar" 2021 10 10))
(define e4 (event "tyler's birthday" 10 "Sep" 2020 20 20))
(define l1 '(e1 e2 e3 e4))

(define (inYear year events)
  (filter (lambda (e) (equal? (event-year e) year)) events))

(check-expect (inYear 2021 l1) '(e1 e2 e3))

定义
l1
的计算结果是符号列表,而不是结构列表

'(e1 e2 e3 e4) = (list 'e1 'e2 'e3 'e4)
您可以将定义和测试输出分别转换为
(列表e1 e2 e3 e4)
(列表e1 e2 e3)

或者,您可以使用准引号-非引号组合,如:

`(,e1 ,e2 ,e3 ,e4)
但这对于简单地定义结构列表来说不太习惯

'(e1 e2 e3 e4) = (list 'e1 'e2 'e3 'e4)