En términos de alcance? Implementación real en la memoria? La sintaxis? Por ejemplo, si (let a 1) es 'a' una variable o un símbolo?¿Cuál es la diferencia entre una variable y un símbolo en LISP?
Respuesta
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.
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.
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
Correcto, esta respuesta apunta en la dirección correcta. –
+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
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.
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
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.
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).
- 1. ¿Cuál es la diferencia entre un átomo y un símbolo en Common Lisp?
- 2. ¿Cuál es la diferencia entre 1 y '1 en Lisp?
- 3. ¿Cuál es la diferencia entre 'y #' en Lisp?
- 4. ¿Cuál es la diferencia entre Lisp-1 y Lisp-2?
- 5. diferencia entre el símbolo y el nombre de la variable en Emacs Lisp
- 6. common-lisp: diferencia entre el enlace y el símbolo
- 7. ¿Cuál es la diferencia entre $ VARIABLE y $ {VARIABLE}
- 8. En Lisp (Clojure, Emacs Lisp), ¿cuál es la diferencia entre la lista y la cita?
- 9. ¿Cuál es la diferencia entre una cadena y un símbolo en Ruby?
- 10. ¿Cuál es la diferencia entre "=" y "=>" y "@variable", "@@ variable" y ": variable" en ruby?
- 11. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 12. ¿Cuál es la diferencia entre una variable miembro y una variable local?
- 13. ¿Cuál es la diferencia entre @ y @@ en un módulo?
- 14. ¿Cuál es la diferencia entre poner @Autowired en una variable y un método?
- 15. ¿Cuál es la diferencia entre un hilo y una fibra?
- 16. ¿Cuál es la diferencia entre una mónada y un cierre?
- 17. ¿Cuál es la diferencia entre un tema y una plantilla?
- 18. ¿Cuál es la diferencia entre un algoritmo y una función?
- 19. ¿Cuál es la diferencia entre una matriz y un objeto?
- 20. ¿Cuál es la diferencia entre una instancia y un objeto?
- 21. ¿Cuál es la diferencia entre un RoutedCommand y una RoutedUICommand?
- 22. ¿Cuál es la diferencia entre un método y una función?
- 23. ¿Cuál es la diferencia entre una heurística y un algoritmo?
- 24. ¿Cuál es la diferencia entre un diccionario y una matriz?
- 25. cuál es la diferencia entre '! =' Y '<>' en MySQL
- 26. Cuál es la diferencia en Perl al pasar una variable en una expresión regular entre usar $ variable y $ {variable}
- 27. ¿Cuál es la diferencia entre dict() y {}?
- 28. ¿Cuál es la diferencia entre Const y Static en C#?
- 29. ¿Cuál es la diferencia entre ".equals" y "=="?
- 30. ¿Cuál es la diferencia entre un threadvar y una variable local
[clisp] (http://clisp.sourceforge.net/) es una implementación particular de Common Lisp, y su pregunta es sobre el idioma, así que me tomé la libertad de cambiar tus etiquetas. – Gilles