如何检查某物是否是原子?我正在寻找类似number?
或list?
的内容。
答案 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。