我正在尝试在带有球拍的功能中使用某个参数之前先检查该参数。此参数必须是列表的列表。
我尝试过:
(andmap (lambda (x) (not (and (list? x) (not (pair? x))))) lst)
具有:
(define lst '('(a) '(b) '(c)))
但是它失败了,因为(pair? '(a))
为真。对于pair?
,我尝试避免使用(a . 1)
点对,因为(list? (a . 1))
也是如此。
如何检查列表是否为列表列表且不包含杂物对?
答案 0 :(得分:2)
三件事:
要检查列表是否为列表列表,只需编写
(define (list-of-lists? v)
(and (list? v) (andmap list? v)))
首先检查该值是否为列表,然后检查其所有元素是否为列表。
如果您这样做是因为某个函数应该仅接受一个列表,而其他值是非法的,则应该使用Racket’s contract system使事情变得更轻松而不是自己进行验证:
(require racket/contract)
(define/contract (f lst-of-lsts)
(-> (listof list?) any/c)
#| do something here |#)
您和许多初次接触它的人一样,对quote
的工作方式似乎有些困惑。您可能是写'((a) (b) (c))
而不是'('(a) '(b) '(c))
。请阅读What is the difference between quote and list?,或只使用list
函数。