我正在尝试使用txexpr
渲染球拍中的项目列表:
(define (item-list items)
(if (empty? items)
(txexpr 'p empty '("No items to display."))
(txexpr* 'ul empty
(for ([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 (rule-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 (rule-list two-items)) result)))
当我运行测试时,第二个测试出现以下错误:
txexpr*: contract violation
expected: txexpr-elements?
given: '(#<void>)
我现在被难住了。如何获得要渲染的项目列表?
所以需要注意的是,在某些时候,你最终得到的是一个列表的列表。
(define (item-list items)
(if (empty? items)
(txexpr 'p empty '("No items to display."))
(txexpr 'ul empty
(for/list ([item items])
(quasiquote (li (unquote (cadr item))))))))
这意味着我需要正确地引用规则列表,并且数据结构对txexpr
来说是可以理解的。例如,运行一个包含两项的列表
(item-list (list '(1 "one") '(2 "two")))
得到这样的数据结构:
'(ul (li "one") (li "two"))
希望能帮助到别人。