2011-03-23 12 views
13

¿Cómo puedo verificar si algo es un átomo? Estoy buscando algo como number? o list?.Compruebe si un argumento es una lista o un átomo

+3

En caso de que no está claro a partir de las respuestas a continuación: el término "átomo" se utiliza de manera diferente por diferentes autores y en diferentes sistemas. Si estás leyendo un texto en particular, probablemente quieras usar la definición de 'átomo' que figura en el texto. Esta es probablemente la razón principal por la que no hay 'átomo'. primitivo existe en el sistema que estás usando. –

Respuesta

3

Cuando varios esquemas no lo incluyen, a menudo he visto atom? define de esta manera:

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

Esto devolverá verdadero si x no es un par (o una lista). Volverá a ser verdadero para números, cadenas, caracteres y símbolos, mientras que symbol? solo retornará verdadero para símbolos, naturalmente. Esto podría o no ser lo que quieres. Comparar el ejemplo de Yasir Arsanukaev:

1 ]=> (map atom? (list 42 'a-symbol (list 12 13) 'foo "yiye!")) 

;Value 13: (#t #t #f #t #t) 

Utiliza pair? porque este comprueba para las listas adecuadas como (1 2 3), pares como (a . b), mientras list? devolverá FALSE para pares de puntos y listas de puntos de cola.

20

Por lo general, tendrá que excluir la lista vacía también:

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

o, si se quiere ser más pedante, a continuación, prohibir vectores también:

(define (atom? x) (not (or (pair? x) (null? x) (vector? x)))) 

Y, por supuesto puede agregar mucho más aquí, ya que está marcado como una pregunta de raqueta, es posible que desee agregar tablas hash, estructuras, etc. etc. Por lo tanto, puede ser más fácil especificar los tipos de valores que considera átomos:

(define (atom? x) 
    (ormap (lambda (p) (p x)) (list number? symbol? boolean? string?))) 

o utilizando el sistema de contratación de la raqueta:

(define atom? (or/c number? symbol? boolean? string?)) 
Cuestiones relacionadas