2011-09-09 9 views
6

En Common Lisp, si quería comprobar si una lista no era nula, simplemente podría usar la lista como condición, ya que todas las listas que no sean nulas se consideran verdaderas. Sin embargo, me parece que en Scheme, hacer lo mismo hará que Scheme piense que estoy tratando de llamar a una función. ¿Hay una mejor manera de comprobar si una lista es nula en Scheme que definir otra función que no sea (not (null? x))?¿La mejor manera de verificar si una lista no es nula?

+0

¿Qué quiere decir con "hará que Scheme piense que estoy intentando llamar a una función"? – leppie

+0

@leppie Scheme se queja si utilizo una lista (que se pasa como un parámetro de función) como un condicional. Busqué la queja en Google y aparentemente Scheme intenta llamar a la función con el nombre del primer elemento de la lista, y como esa función no existe, Scheme se queja – wrongusername

+1

Parece que no está citando la lista, iow ' (1 2 3) 'vs' '(1 2 3) 'con lo último siendo correcto. las listas vacías también necesitan ser citadas, iow ''()'. – leppie

Respuesta

7

En Scheme, todo lo que no es #f es cierto, por lo que '() se considera en if declaraciones.

Por lo tanto,

(if '() "true" "false") => "true" 
(not '()) => #f 

Usando (not (null? x)) es la forma más sencilla de comprobar si una lista no es nulo: describe exactamente lo que quiere, y en casos extremos donde se le den algo que no es una lista , le dará un comportamiento diferente:

(if (not (null? #t)) "true" "false") => "true" 
(if (not #t) "true" "false") => "false" 
4

Si sabes que es una lista, puedes usar (pair? x), ya que cada lista es un par o '().

Cuestiones relacionadas