Eli*_*lay 21
通常,您也要排除空列表:
(define (atom? x) (not (or (pair? x) (null? x))))
Run Code Online (Sandbox Code Playgroud)
或者,如果你想更迂腐,那么也禁止向量:
(define (atom? x) (not (or (pair? x) (null? x) (vector? x))))
Run Code Online (Sandbox Code Playgroud)
当然,你可以在这里添加更多 - 因为它被标记为一个球拍问题,你可能想要添加哈希表,结构等等.所以它也可以更容易指定你考虑的值的种类作为原子:
(define (atom? x)
(ormap (lambda (p) (p x)) (list number? symbol? boolean? string?)))
Run Code Online (Sandbox Code Playgroud)
或使用球拍合同系统:
(define atom? (or/c number? symbol? boolean? string?))
Run Code Online (Sandbox Code Playgroud)
当各种 Schemes 不包含它时,我经常看到这样atom?定义:
(define (atom? x) (not (pair? x)))
Run Code Online (Sandbox Code Playgroud)
如果x不是一对(或列表),这将返回 true 。它将对数字、字符串、字符和符号symbol?返回 true ,而自然只对符号返回 true。这可能是也可能不是您想要的。比较 Yasir Arsanukaev 的例子:
1 ]=> (map atom? (list 42 'a-symbol (list 12 13) 'foo "yiye!"))
;Value 13: (#t #t #f #t #t)
Run Code Online (Sandbox Code Playgroud)
它使用pair?是因为这会检查正确的列表,例如(1 2 3),对之类的(a . b),而list?对于点对和点尾列表将返回 false。