使用 racket txexpr 渲染列表

Using racket txexpr to render a list

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

希望对别人有帮助。