使用球拍txexpr渲染列表

  • 本文关键字:列表 txexpr html racket
  • 更新时间 :
  • 英文 :


我正在尝试使用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"))

希望能帮助到别人。

相关内容

  • 没有找到相关文章

最新更新