You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Racket:如何对结构体列表中的结构体指定字段执行filter过滤操作

问题原因

你的inYear函数过滤逻辑本身没有问题,错误出在列表的定义方式上:

  • 你定义测试列表l1时使用了引用列表写法'(e1 e2 e3 e4),Racket不会对引用列表内的标识符做求值处理,因此l1中存储的是e1、e2这类符号值,而非你之前创建的event结构体实例,自然无法通过event-year取到对应的年份值,导致过滤逻辑失效。
  • 测试用例的期望结果同样使用了引用列表'(e1 e2 e3),存储的也是符号值,和过滤后得到的结构体实例列表永远无法相等,也会导致测试不通过。

修正方案

把所有需要存储实际结构体实例的列表,从引用列表写法改为list函数创建即可,修正后完整代码如下:

(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))
;; 改用list函数创建列表,参数会被正常求值得到结构体实例
(define l1 (list e1 e2 e3 e4))

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

;; 期望结果也改用list函数生成
(check-expect (inYear 2021 l1) (list e1 e2 e3))

内容的提问来源于stack exchange,提问作者Nikki Roberts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 02:36:09