使用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
相关产品推荐
相关产品推荐

