检查参数是列表还是原子

Koe*_*oen 14 scheme racket

如何检查某物是否是原子?我正在寻找像number?或的东西list?.

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)


mic*_*kig 5

当各种 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。