Проверьте, является ли аргумент списком или атомом - PullRequest
14 голосов
/ 23 марта 2011

Как я могу проверить, является ли что-то атомом? Я ищу что-то вроде number? или list?.

Ответы [ 2 ]

21 голосов
/ 23 марта 2011

Обычно вы также хотите исключить пустой список:

(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?))
4 голосов
/ 23 марта 2011

Когда различные схемы не включают его, я часто видел, как atom? определялся так:

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

Это вернет true, если x не пара (или список). Он вернет true для чисел, строк, символов и символов, в то время как symbol? вернет true только для символов, естественно. Это может или не может быть то, что вы хотите. Сравните пример Ясира Арсанукаева:

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 для пар с точками и списков с точечным хвостом.

...