tutorial ropa online descargar lisp scheme racket

lisp - online - racket ropa



¿Qué es exactamente un símbolo en lisp/scheme? (5)

De Estructura e Interpretación de Programas de Computadora Segunda Edición por Harold Abelson y Gerald Jay Sussman 1996:

Para manipular símbolos, necesitamos un nuevo elemento en nuestro lenguaje: la capacidad de citar un objeto de datos. Supongamos que queremos construir la lista (ab). No podemos lograr esto con (lista ab), porque esta expresión construye una lista de los valores de ayb en lugar de los símbolos mismos. Este problema es bien conocido en el contexto de los lenguajes naturales, donde las palabras y oraciones se pueden considerar como entidades semánticas o como cadenas de caracteres (entidades sintácticas). La práctica común en los lenguajes naturales es usar comillas para indicar que una palabra o una oración debe tratarse literalmente como una cadena de caracteres. Por ejemplo, la primera letra de "John" es claramente "J." Si le decimos a alguien "diga su nombre en voz alta", esperamos oír el nombre de esa persona. Sin embargo, si le decimos a alguien "diga ''su nombre'' en voz alta," esperamos escuchar las palabras "su nombre". Tenga en cuenta que estamos obligados a anotar comillas para describir lo que alguien más podría decir. Podemos seguir esta misma práctica para identificar listas y símbolos que se deben tratar como objetos de datos en lugar de como expresiones para evaluar. Sin embargo, nuestro formato de cotización difiere del de los lenguajes naturales en que colocamos una comilla (tradicionalmente, el símbolo de comilla simple '') solo al principio del objeto a cotizar. Podemos salirse con la suya en la sintaxis Scheme porque confiamos en espacios en blanco y paréntesis para delimitar objetos. Por lo tanto, el significado del carácter de comilla simple es citar el siguiente objeto. Ahora podemos distinguir entre símbolos y sus valores:

(define a 1) (define b 2) (list a b) (1 2) (list ’a ’b) (a b) (list ’a b) (a 2)

Las listas que contienen símbolos pueden verse exactamente como las expresiones de nuestro lenguaje:

(* (+ 23 45) (+ x 9)) (define (fact n) (if (= n 1) 1 (* n (fact (- n 1)))))

Ejemplo: diferenciación simbólica

Por el amor del todopoderoso, aún no he comprendido el propósito del símbolo ''iamasymbol . Entiendo números, booleanos, cadenas ... variables. Pero los símbolos son demasiado para mi pequeña mente de pensamiento imperativo. ¿Para qué los uso exactamente? ¿Cómo se supone que deben usarse en un programa? Mi comprensión de este concepto es simplemente un fracaso.


En Scheme and Racket, un símbolo es como una cadena inmutable que pasa a ser internada de modo que los símbolos se pueden comparar con eq? (rápido, esencialmente comparación de puntero). Los símbolos y las cadenas son tipos de datos separados.

Un uso para los símbolos es enumeraciones livianas. Por ejemplo, uno podría decir que una dirección es ''north , ''south , ''east u ''west . Por supuesto, podría usar cadenas para el mismo propósito, pero sería un poco menos eficiente. Usar números sería una mala idea; representar la información de la manera más obvia y transparente posible.

Para otro ejemplo, SXML es una representación de XML utilizando listas, símbolos y cadenas. En particular, las cadenas representan datos de caracteres y los símbolos representan nombres de elementos. Por lo tanto, el <em>hello world</em> XML estaría representado por el valor (list ''em "hello world") , que se puede escribir de forma más compacta ''(em "hello world") .

Otro uso para los símbolos es como llaves. Por ejemplo, podría implementar una tabla de métodos como símbolos de mapeo de un diccionario para funciones de implementación. Para llamar a un método, busca el símbolo que corresponde al nombre del método. Lisp / Scheme / Racket lo hace realmente fácil, porque el lenguaje ya tiene una correspondencia incorporada entre identificadores (parte de la sintaxis del lenguaje) y símbolos (valores en el idioma). Esa correspondencia facilita el soporte de macros , que implementan extensiones sintácticas definidas por el usuario para el lenguaje. Por ejemplo, uno podría implementar un sistema de clases como una macro biblioteca, utilizando la correspondencia implícita entre "nombres de métodos" (una noción sintáctica definida por el sistema de clases) y símbolos:

(send obj meth arg1 arg2) => (apply (lookup-method obj ''meth) obj (list arg1 arg2))

(En otros Lisps, lo que he dicho es mayormente truish, pero hay cosas adicionales que deben conocerse, como paquetes y funciones en comparación con ranuras variables, IIRC).


Los símbolos en lisp son identificadores legibles por humanos. Ellos son todos solteros. Entonces, si declara ''foo en alguna parte de su código y luego usa'' foo nuevamente '', apuntará al mismo lugar en la memoria.

Uso de la muestra: diferentes símbolos pueden representar diferentes piezas en un tablero de ajedrez.


Un símbolo es solo un nombre especial para un valor. El valor puede ser cualquier cosa, pero el símbolo se usa para referirse al mismo valor cada vez, y este tipo de cosas se usa para hacer comparaciones rápidas. Como dices que eres un pensamiento imperativo, son como constantes numéricas en C, y así es como generalmente se implementan (números almacenados internamente).


Un símbolo es un objeto con una representación de cadena simple que (por defecto) está garantizado para ser internado ; es decir, dos símbolos que se escriben de la misma forma son el mismo objeto en la memoria (igualdad de referencia).

¿Por qué Lisps tiene símbolos? Bueno, en gran medida es un artefacto del hecho de que Lisps incorpora su propia sintaxis como un tipo de datos del lenguaje. Los compiladores e intérpretes usan símbolos para representar identificadores en un programa; dado que Lisp le permite representar la sintaxis de un programa como datos, proporciona símbolos porque son parte de la representación.

¿Qué son útiles aparte de eso? Bueno, algunas cosas:

  • Lisp se usa comúnmente para implementar lenguajes específicos de dominio incrustados. Muchas de las técnicas utilizadas para eso provienen del mundo del compilador, por lo que los símbolos son una herramienta útil aquí.
  • Las macros en Common Lisp generalmente implican tratar con símbolos con más detalle de lo que proporciona esta respuesta. (Aunque en particular, la generación de identificadores únicos para macroexpansiones requiere poder generar un símbolo que garantice que nunca será igual a ningún otro).
  • Los tipos de enumeración fija se implementan mejor como símbolos que como cadenas, porque los símbolos se pueden comparar por igualdad de referencia.
  • Hay muchas estructuras de datos que puede construir donde puede obtener un beneficio de rendimiento al usar símbolos e igualdad de referencia.