¿Qué es ''(apóstrofo) en Lisp/Scheme?
quote the-little-schemer (7)
Estoy en el día 1 hora 1 de enseñarme Scheme. No hace falta decir que no entiendo nada. Así que estoy leyendo The Little Schemer y estoy usando esto:
como intérprete
Necesito usar ''
en, por ejemplo,
(atom? ''turkey)
para evitar un error de "variable indefinida". El ''
, de acuerdo con el libro, es una cosa de Common Lisp.
Tengo dos preguntas:
¿El intérprete que mencioné arriba es bueno? ¿Puedes recomendar otro? Necesito uno que vaya bien con The Little Schemer .
Que es
''
?
Sugiero que se mueva a un entorno mejor, como PLT Scheme , que tiene un IDE, depurador y muchas bibliotecas. A medida que avances y comiences a escribir programas más grandes, los necesitarás.
El carácter de comillas simples es azúcar sintáctica para la expresión "cita", por lo que "pavo es lo mismo que (cita Turquía). Básicamente, lo que hace "quote" es desactivar el evaluador Scheme. En otras palabras, "cita" devuelve la expresión, palabra por palabra. Si no hubiera una "cita", entonces Scheme trataría de evaluar "turkey" en el entorno actual. Esto no es una cosa de Common Lisp, sino algo de Lisp. Common Lisp y Scheme son dos dialectos de Lisp. Los usos de "quote" se explican en todos los tutoriales / libros de Lisp. También vea las respuestas a esta pregunta .
Debe comprender las reglas básicas de evaluación de Scheme.
Primero :
(atom? ''turkey)
La lista es una aplicación de función, entonces atom?
se evalúa a una función. ''turkey
es una notación abreviada para (quote turkey)
. La evaluación (quote turkey)
da el símbolo turkey
.
Luego, la función se aplica al símbolo turkey
y se calcula un valor de retorno.
Segundo
(atom? turkey)
Nuevamente tenemos una aplicación de función y atom?
se evalúa a una función. Esta vez turkey
es una variable. La evaluación de turkey
le da el valor que está ligado a ella, sea lo que sea.
Entonces la función se aplica al valor de la variable turkey
.
Resumen
turkey
es una variable, que se evalúa a su valor. ''turkey
es (quote turkey)
, que se evalúa en el símbolo turkey
.
Scheme reutiliza s-expressions y construye sus programas a partir de s-expressions. Esto lleva al problema de que en algún momento turkey
debe ser una variable y, a veces, debe ser el símbolo. Esto es un poco confuso para el principiante. Después de un tiempo, verás el poder que hay detrás.
El carácter de comillas simples es una forma abreviada de decir (cita a foo) donde cita es la forma de devolver solo foo sin evaluarlo.
Una cosa para recordar realmente en Scheme o en cualquier Lisp es que todo se evalúa de manera predeterminada. Por lo tanto, en los casos en que no desee evaluar, necesita una forma de resolver esto.
Citar algo hace exactamente esto y la comilla simple solo requiere menos tipeo y conduce a un código menos detallado.
La abreviatura de (quote ...)
convierte el código en datos.
stuff
es un símbolo, eso significa que puede ser un nombre de una variable o nombre de una función, etc.
''stuff
te da el símbolo "cosas" en sí mismo.
(dostuff "on" those 4 :parameters)
cuando se evaluó, ejecutaría la función dostuff
con cuatro parámetros: cadena, contenido de la variable, número y palabra clave.
''(dostuff "on" those 4 :parameters)
cuando se evalúa devolverá el código anterior, que, cuando se evalúa, a su vez ejecutará la función dostuff
con esos cuatro parámetros.
Por ejemplo: Ejecutar ''''''somecode
, devuelve ''''somecode
. Ejecuta ''''somecode
, devuelve ''somecode
. Ejecuta ''somecode
, devuelve somecode
. Ejecuta somecode
, y ... bueno ... somecode
se ejecutará.
Puedes decir que ''
es un poco como lo opuesto a (eval..)
.
(eval (eval (eval ''''''(print "hello"))))
imprimiría "Hola".
(eval (eval (eval ''''''''(print "hello")))
- note uno más ''
luego eval
- no imprimiría nada, pero devolvería el código (print "hello")
!
Excepto que los parlanchines tienden a llamar a ese código devuelto (y algunas veces incluso a un código escrito a mano) "lista" en lugar de "código", por razones que sangrarán obvias a medida que cavan un poco más. Buena suerte :)
La forma ''foo
es simplemente una manera más rápida de escribir la forma especial
(quote foo)
es decir, "no evalúe el nombre foo y reemplácelo por su valor; realmente me refiero al nombre foo".
Creo que SISC está perfectamente bien para explorar los ejercicios en TLS.
SISC es bueno, pero un ejecutor del esquema en línea aún más ligero es http://codepad.org . En realidad, no es REPL porque no es interactivo, pero está bastante cerca. El código que envía se ejecuta en el lado del servidor en lugar de usar un applet del navegador. Y puede compartir el código que está ejecutando por URL corta.
La página about del teclado dice que usa "MzScheme v372 [cgc]".
Utilizo el teclado para todo tipo de pruebas de fragmentos rápidos (¡incluidas muestras de códigos de prueba para respuestas de SO!).
Para la sintaxis de cotización, la diferencia se puede ver usando un código como este:
(let ((x 5))
(display x) (newline)
(display ''x) (newline))
Esto muestra:
5 x
En el primer caso, x
se evalúa y se pasa a la display
, que imprime 5. En el segundo caso, el símbolo x
(que no es lo mismo que una cadena de caracteres) se pasa a la display
, que imprime el nombre del símbolo .
Si busca el mejor IDE para el scheme
entonces vaya al Dr Racket
. Pero cuando inicie Dr Racket
primera línea debería ser el #lang scheme
puesto que Dr Racket
tiene muchos idiomas, hemos mencionado explícitamente qué idioma vamos a usar.
Cuando queremos pasar un argumento en sí mismo en lugar de pasar el valor del argumento, usamos quote. Está principalmente relacionado con el procedimiento que pasa durante el uso de listas, pares y átomos que no están disponibles en lenguaje de programación C (la mayoría de las personas comienzan a programar usando programación C, por lo tanto nos confundimos). Este es el código del lenguaje de programación Scheme que es un dialecto de ceceo y supongo que puedes entender este código.
(define atom? ; defining a procedure atom?
(lambda (x) ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? ''(a b c)) ; since it is a list it is false #f
La última línea (átomo? ''Abc) está pasando abc como está al procedimiento para comprobar si abc es un átomo o no, pero cuando pasas (atom? Abc) luego verifica el valor de abc y pasa el valor a eso. Desde entonces, no le hemos dado ningún valor