2010-08-28 7 views

Respuesta

18

puntos de respuesta de Jörg en la dirección correcta. Déjame agregarle un poco.

Hablaré de Lisps que son similares a Common Lisp.

Símbolos como una estructura de datos

Un símbolo es una estructura de datos real en Lisp. Puede crear símbolos, puede usar símbolos, puede almacenar símbolos, puede pasar símbolos y los símbolos pueden formar parte de estructuras de datos más grandes, por ejemplo, listas de símbolos. Un símbolo tiene un nombre, puede tener un valor y puede tener un valor de función.

Para que pueda tomar un símbolo y establecer su valor.

(setf (symbol-value 'foo) 42) 

Por lo general, uno escribiría (setq foo 42) o (set 'foo 42) o (setf foo 42).

Símbolos en el código que indica las variables

Pero!

(defun foo (a) 
    (setq a 42)) 

o

(let ((a 10)) 
    (setq a 42)) 

En ambas formas anteriormente en el código fuente hay símbolos y a está escrito como un símbolo y usando la función READ para leer esa fuente devuelve un símbolo a en alguna lista. Pero la operación setq NO establece el valor del símbolo de a en 42. Aquí el LET y el DEFUN introducen VARIABLEa que escribimos con un símbolo. Por lo tanto, la operación SETQ establece el valor de la variable en 42.

léxico vinculante

lo tanto, si nos fijamos en:

(defvar foo nil) 

(defun bar (baz) 
    (setq foo 3) 
    (setq baz 3)) 

se introduce una variable global FOO.

En la barra, el primer SETQ establece el valor del símbolo de la variable global FOO. El segundo SETQ establece la variable local BAZ en 3. En ambos casos, usamos el mismo SETQ y escribimos la variable como un símbolo, pero en el primer caso el FOO dona una variable global y esos almacenan valores en el valor del símbolo. En el segundo caso, BAZ denota una variable local y cómo se almacena el valor, no lo sabemos. Todo lo que podemos hacer es acceder a la variable para obtener su valor. En Common Lisp no hay forma de tomar un símbolo BAZ y obtener el valor de la variable local. No tenemos acceso a los enlaces de variables locales y sus valores usando símbolos. Esa es una parte de cómo funciona el enlace léxico de las variables locales en Common Lisp.

Esto lleva, por ejemplo, a la observación de que en el código compilado sin información de depuración registrada, el símbolo BAZ ha desaparecido. Puede ser un registro en su procesador o implementado de otra manera. El símbolo FOO todavía está allí, porque lo usamos como una variable global.

diversos usos de símbolos

Un símbolo es un tipo de datos, una estructura de datos en Lisp.

Una variable es una cuestión conceptual. Las variables globales se basan en símbolos. Variables léxicas locales no.

En el código fuente escribimos todo tipo de nombres para funciones, clases y variables usando símbolos.

existe un cierto solapamiento conceptual:

(defun foo (bar) (setq bar 'baz)) 

en el código fuente anterior, defun, foo, bar, setq y baz son todos los símbolos.

DEFUN es un símbolo que proporciona una macro. FOO es un símbolo que proporciona una función. SETQ es un símbolo que proporciona un operador especial. BAZ es un símbolo utilizado como datos. Por lo tanto, la cita anterior al BAZ. BAR es una variable. En el código compilado, su símbolo ya no es necesario.

4

Lisp usa entornos que son similares a los mapas (clave -> valor) pero con mecanismos extra incorporados para encadenar entornos y controlar enlaces.

Ahora, símbolos son más o menos, teclas (excepto símbolos forma especial), y punto a un valor,
es decir función, número entero, lista, etc.
Desde Común Lisp le da una manera de alterar los valores, es decir, con setq, los símbolos en algunos contextos
(su ejemplo) también son variables.

9

A símbolo es un nombre para una cosa. Una variable es un puntero mutable a una ubicación de almacenamiento mutable.

En el fragmento de código que mostró, ambos let y a son símbolos. Dentro del alcance del bloque let, el símbolo a denota una variable que actualmente está vinculada al valor 1.

Pero el nombre de la cosa no es la cosa en sí. El símbolo a no es una variable. Es un nombre para una variable. Pero solo en este contexto específico. En un contexto diferente, el nombre a puede referirse a algo completamente diferente.

Ejemplo: el símbolo jaguar pueden, dependiendo del contexto, denotar

+1

Correcto, esta respuesta apunta en la dirección correcta. –

+0

+1 para mencionar símbolos que significan cosas diferentes en contextos diferentes. Esto realmente ayuda a tratar de entender la diferencia entre ** x ** y ** # 'x ** y **' x **. – Baggers

11

Citando del Common Lisp HyperSpec:

symboln. un object de typesymbol.

variablen. a binding en la "variable" namespace.

bindingn. una asociación entre name y la que indica el nombre . (...)

Tiempo de explicación.

Lo que Lisp llama símbolos es bastante parecido a lo que muchos idiomas denominan variables. En una primera aproximación, los símbolos tienen valores; cuando evalúa la expresión x, el valor de la expresión es el valor del símbolo x; cuando escribe (setq x 3), asigna un nuevo valor a x. En la terminología de Lisp, (setq x 3) vincula el valor 3 al símbolo x.

Una característica de Lisp que la mayoría de los idiomas no tiene es que los símbolos son objetos ordinarios (los símbolos son objetos de primera clase, en la terminología del lenguaje de programación). Cuando escribe (setq x y), el valor de x se convierte en el valor de y que tenía en el momento de la asignación. Pero puede escribir (setq x 'y), en cuyo caso el valor de x es el símbolo y.

En términos conceptuales, existe un environment que es una tabla de asociación de símbolos a valores. Evaluar un símbolo significa buscarlo en el entorno actual. (Los entornos también son objetos de primera clase, pero esto está más allá del alcance de esta respuesta.) Un enlace se refiere a una entrada particular en un entorno. Sin embargo, hay una complicación adicional.

La mayoría de los dialectos Lisp tienen múltiples espacios de nombres, al menos un espacio de nombres de variables y un espacio de nombres de funciones. De hecho, un entorno puede contener entradas múltiples para un símbolo, una entrada para cada espacio de nombres. Una variable, estrictamente hablando, es una entrada en un entorno en el espacio de nombres de las variables. En la terminología cotidiana Lisp, un símbolo se refiere a menudo como una variable cuando su unión como una variable es lo que le interesa.

Por ejemplo, en (setq a 1) o (let ((a 1)) ...), a es un símbolo. Pero como las construcciones actúan sobre el enlace variable para el símbolo a, es común referirse a a como una variable en este contexto.

Por otro lado, en (defun a (...) ...) o (flet ((a (x) ...)) ...), a también es un símbolo, pero estas construcciones actúan sobre la unión de su función, por lo a no se consideraría una variable.

En la mayoría de los casos, cuando un símbolo aparece sin comillas en una expresión, se evalúa buscando su enlace variable. La principal excepción es que en una llamada de función (foo arg1 arg2 ...), se utiliza la función de vinculación para foo. El valor de un símbolo entrecomillado 'x o (quote x) es él mismo, como con cualquier expresión entrecomillada. Por supuesto, hay un montón de formas especiales en las que no es necesario citar un símbolo, incluyendo setq, let, flet, defun, etc.

1

Símbolo y variables son 2 cosas diferentes. Al igual que en el símbolo matemático es un valor. Y variable tiene el mismo significado que en matemática.

Pero su confusión vino del hecho de que los símbolos son la representación meta de una variable.

Eso es si lo hace

(setq a 42) 

Usted acaba de definir una variable a. Por cierto, la forma común Lisp almacenar es arrojar la estructura de un símbolo.

En los labios comunes el símbolo es una estructura con una propiedad diferente. Cada uno de ellos puede ser el acceso a la función como symbol-name, symbol-function ...

En el caso de la variable que se puede acceder a través de su valor s symbol-value

? (symbol-value 'a) 
42 

Este no es el caso común de obtener el valor de una .

? a 
42 

Tenga en cuenta que los símbolos son auto evaluación que quiere decir que si le preguntas a un símbolo se obtiene el símbolo no los symbol-value

? 'a 
A 
2

Un símbolo es un objeto de datos Lisp. Una "forma" Lisp significa un objeto Lisp que se pretende evaluar. Cuando un símbolo en sí mismo se usa como una forma Lisp, es decir, cuando evalúa un símbolo, el resultado es un valor que está asociado con ese símbolo. La forma en que los valores están asociados con los símbolos es una parte profunda del lenguaje Lisp. Si el símbolo ha sido declarado "especial" o no cambia en gran medida la forma en que funciona la evaluación.

Los valores léxicos se indican con símbolos, pero no se pueden manipular esos símbolos como objetos.En mi opinión, explicar algo en Lisp en términos de "punteros" o "ubicaciones" no es la mejor manera.

1

Adición de una nota al margen de las respuestas anteriores:

Los recién llegados a Lisp menudo no están seguros exactamente lo que los símbolos son para, además de ser los nombres de las variables. Creo que la mejor respuesta es que son como constantes de enumeración, excepto que no tiene que declararlas antes de usarlas. Por supuesto, como otros han explicado, también son objetos. (Esto no debería parecer extraño a los usuarios de Java, en los que las constantes de enumeración también son objetos).

Cuestiones relacionadas