Scheme 检查参数是列表还是原子

Scheme 检查参数是列表还是原子,scheme,racket,Scheme,Racket,我如何检查某物是否是原子?我正在寻找类似于number?或list?的东西,当各种方案不包括它时,我经常看到atom?这样定义: (define (atom? x) (not (pair? x))) 如果x不是一对(或一个列表),则返回true。它将为数字、字符串、字符和符号返回true,而symbol?自然只为符号返回true。这可能是你想要的,也可能不是。比较Yasir Arsanukaev的例子: 1 ]=> (map atom? (list 42 'a-symbol (list

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

的东西,当各种方案不包括它时,我经常看到
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

通常,您还需要排除空列表:

(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?))

如果下面的答案不清楚:“原子”一词在不同的作者和不同的系统中使用的方式不同。如果您正在阅读特定的文本,您可能希望使用文本中给出的“atom”定义。这可能是您使用的系统中不存在“atom”原语的主要原因。