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

使用Racket txexpr渲染列表时报contract violation错误如何解决

问题根因
  • 你在生成li元素时用了普通for循环,Racket中普通for没有返回值(返回#<void>),txexpr*接收了void值后触发了类型校验错误。
  • 测试代码中调用的函数名是rule-list,和你实际定义的item-list不匹配,即使渲染逻辑修复也会运行报错。
修复方案

把生成子元素的for替换为for/list,它会把每次迭代生成的li元素收集成列表,符合txexpr的子元素格式要求。你也可以直接用普通txexpr代替txexpr*,不需要额外处理参数展开:

(define (item-list items)
  (if (empty? items)
      (txexpr 'p empty '("No items to display."))
      (txexpr 'ul empty
              (for/list ([item items])
                (txexpr 'li empty (list (cadr item)))))))

同时修改测试代码里的函数调用名称:

(module+ test
   (test-case "item-list will return a default message if the item list is empty"
     (define result "<p>No items to display.</p>")
     (define no-items empty)
     (check-equal? (xexpr->html (item-list no-items)) result))
  (test-case "item-list will return an unordered list of each item"
    (define result "<ul><li>email address</li><li>phone number</li></ul>")
    (define two-items '((1 "email address") (2 "phone number")))
    (check-equal? (xexpr->html (item-list two-items)) result)))

修改完成后即可正常通过所有测试用例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:04