2010-10-04 12 views
12

¿Hay alguna diferencia entre lo que en Common Lisp llamarías un átomo y un símbolo?¿Cuál es la diferencia entre un átomo y un símbolo en Common Lisp?

¿Estas diferencias se extienden a otros idiomas en la familia Lisp?

(soy consciente de que un átomo tiene un significado diferente en Clojure, pero estoy interesado en los límites de lo que es un símbolo.)

+0

El nombre "átomo" viene del griego "atomos" que significa "indivisible". Entonces, se pensó que las moléculas estaban compuestas por partículas indivisibles llamadas "átomos" y que cualquier cosa que no sea un "contra" en Lisp normalmente no se puede dividir. – erjiang

Respuesta

11

En Common Lisp, átomo se define como cualquier objeto, precisamente, eso no es un inconveniente. Ver http://l1sp.org/cl/atom para más detalles.

No conozco otros idiomas de la familia Lisp.

1

En el Esquema, un átomo es cualquier cosa que no es un par:

> (pair? 1) 
#f 
> (pair? '(1 2 3)) 
#t 
> (pair? 'a) 
#f 

Así símbolos son átomos, tal como números y cadenas. átomo tiene una definición similar en Common Lisp, donde la función (atom object) se define como (not (consp object)).

+0

Esta es solo una de las posibles definiciones de un "átomo" en Scheme. –

0

En Common Lisp, un símbolo es muy parecido a una variable en otros idiomas, aunque más pesado (no es solo una pieza en blanco de memoria lo suficientemente grande como para contener un valor). Por lo general, es intern ed para que pueda ser referenciado por su nombre, aunque es posible tener símbolos anónimos (muy parecido a la memoria en C a la que solo puede hacer referencia mediante el puntero).

Un átomo es un valor que no es una celda cons. Un símbolo es un átomo, y también un número, una cadena y muchas otras cosas. El uso más común de las celdas cons es crear listas, aunque es posible utilizarlas de otras formas.

+1

un símbolo no es como una variable en otros idiomas. un símbolo es un 'objeto' con un nombre. En el código fuente escribimos variables con símbolos, pero eso no hace que un símbolo sea necesariamente una variable. (defun foo (bar) bar) <- aquí BAR es un símbolo en el código fuente, pero el símbolo no es la variable en una función compilada FOO. –

+0

@Rainer: Desafortunadamente, no conozco una buena manera de describir un símbolo CL de una manera que sea inmediatamente inteligible. No es solo un objeto con un nombre. Ni siquiera tiene que tener un nombre (pensar '(gensym)'), y es un tipo de objeto bastante extraño. –

+0

Claro que tiene un nombre: (nombre-símbolo (gensym)) -> "G1620994". Es solo un nombre computado. Un símbolo es un objeto que tiene un nombre, puede buscarse por nombre si está internado en un paquete y puede usarse para hacer referencia a un valor, una función, su paquete, su nombre y una lista de propiedades. –

4

'atom' se ve generalmente desde el procesamiento de la lista. En Common Lisp, algo es una lista no vacía o un átomo. En tiempos anteriores, un átomo también se llamaba 'símbolo atómico', que es algo ligeramente diferente. Ahora, en Common Lisp los átomos no son solo símbolos, sino todo lo demás que no es una celda de cons (ejemplos: cadenas, números, tablas, secuencias, ...).

Si algo no es un átomo (es un inconveniente), se pueden utilizar las operaciones CAR, CDR, FIRST y REST.

So atom es un grupo de estructura de datos. Un símbolo es una cierta estructura de datos, que también es un átomo.

Cuestiones relacionadas