检查参数是列表还是原子

时间:2011-03-23 11:43:19

标签: scheme racket

如何检查某物是否是原子?我正在寻找类似number?list?的内容。

2 个答案:

答案 0 :(得分:21)

通常,您也希望排除空列表:

(define (atom? x) (not (or (pair? x) (null? x))))

或者,如果你想更迂腐,那么也禁止载体:

(define (atom? x) (not (or (pair? x) (null? x) (vector? x))))

当然你可以在这里添加更多 - 因为它被标记为一个球拍问题,你可能想要添加哈希表,结构等等。所以它也可以更容易指定值的种类你确实认为是原子:

(define (atom? x)
   (ormap (lambda (p) (p x)) (list number? symbol? boolean? string?)))

或使用球拍合约系统:

(define atom? (or/c number? symbol? boolean? string?))

答案 1 :(得分:4)

当各种方案不包括它时,我经常看到atom?这样定义:

(define (atom? x) (not (pair? x)))

如果x不是一对(或列表),则返回true。对于数字,字符串,字符和符号,它将返回true,而symbol?只会自然地为符号返回true。这可能是也可能不是你想要的。比较Yasir Arsanukaev的例子:

1 ]=> (map atom? (list 42 'a-symbol (list 12 13) 'foo "yiye!"))

;Value 13: (#t #t #f #t #t)

它使用pair?,因为它会检查(1 2 3)之类的正确列表,(a . b)之类的对,而list?将为虚线对和点尾列表返回false。