Pregunta

Estoy en el día 1 hora 1 de enseñar a mí mismo esquema. Ni que decir tiene, que no entiendo nada. Así que estoy leyendo The Little Schemer y el uso de esta cosa:

  

http://sisc-scheme.org/sisc-online.php

como intérprete.

Necesito usar ' en, por ejemplo

(atom? 'turkey)

para evitar un error "variable no definida". El ', según el libro, es una cosa Common Lisp.

Tengo dos preguntas:

  1. Es el intérprete que he mencionado anteriormente una buena? Se puede recomendar otro? Necesito uno que vaya bien con The Little Schemer .

  2. ¿Cuál es '?

¿Fue útil?

Solución

La forma 'foo es simplemente una forma más rápida de escribir la forma especial

(quote foo)

Es decir,. "No evalúan el nombre foo y sustituirla por su valor; que realmente quiero decir el nombre foo"

Creo SISC está perfectamente bien para explorar los ejercicios en TLS.

Otros consejos

Es necesario comprender las reglas de evaluación básicos del Esquema.

Primera

(atom? 'turkey)

La lista es una aplicación de función, por lo atom? se evalúa a una función. 'turkey es una notación abreviada para (quote turkey). La evaluación de (quote turkey) da el símbolo turkey.

Así que la próxima la función se aplica al símbolo turkey y se calcula un valor de retorno.

Segundo

(atom? turkey)

Una vez más tenemos una aplicación de función y atom? consigue evaluados a una función. Este turkey el tiempo es una variable. La evaluación de turkey da el valor que se une a él -. Lo que nunca es

Entonces, la función se aplica al valor de la variable de turkey.

Resumen

turkey es una variable, que consigue evalúa a su valor. 'turkey es (quote turkey), que consigue evalúa al símbolo turkey.

Esquema reutiliza s-expresiones y construye sus programas de s-expresiones. Esto nos 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 algún tiempo verá el poder detrás de él.

SISC es bueno, pero un ejecutor aún más ligera Esquema línea es http://codepad.org . No es en realidad un REPL en que no es interactivo, pero es bastante estrecha. Código de enviar se ejecuta en el lado servidor en lugar de utilizar un applet de navegador. Y usted puede compartir código que se está ejecutando por URL corta.

El sobre página en la pantalla de códigos dice que utiliza "MzScheme V372 [CGC]".

Yo uso del teclado para todo tipo de pruebas fragmento rápida (incluyendo ejemplos de código de prueba para SO respuestas!).

Para la sintaxis cita, la diferencia se puede ver utilizando el código siguiente:

(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 display, que imprime 5. En el segundo caso, el símbolo x (que no es lo mismo que una cadena de caracteres) es pasado a display, que imprime el nombre del símbolo.

Abreviatura de (quote ...), ' convierte en datos de código.

stuff es un símbolo, que significa que puede ser un nombre de una variable o nombre de una función, etc ..
'stuff le da el símbolo "cosas" en sí mismo.

(dostuff "on" those 4 :parameters) cuando se evalúa, correría dostuff función con cuatro parámetros:. Cadena, el contenido de la variable de ellos, el número y la palabra clave
'(dostuff "on" those 4 :parameters) cuando se evaluó devolvería el código anterior, la cual, cuando se evalúa, a su vez ejecutar dostuff función con que los cuatro parámetros ..

Por ejemplo: '''somecode correr, devuelve ''somecode. ''somecode correr, devuelve 'somecode. 'somecode correr, devuelve somecode. Ejecutar somecode, y ... bueno ... somecode se ejecutará.

Se puede decir que ' es un poco como lo contrario de (eval..).

(eval (eval (eval '''(print "hello")))) imprimiría "Hola".
(eval (eval (eval ''''(print "hello"))) - notar una ' más de eval - no imprimir nada, pero sería devolver el código en sí (print "hello") !!

A excepción de que lispers tienden a llamar a ese código devuelto (ya veces incluso el código escrito a mano) "lista" en lugar de "código", por razones que serán evidentes sangrando a medida que cavar un poco más profundo. Buena suerte :)

  1. Sugiero que se muda a un mejor medio ambiente como PLT Esquema, que tiene un IDE, depurador y un montón de bibliotecas. A medida que avanza hacia adelante y empezar a escribir programas más grandes, que los necesitará.

  2. El carácter comilla simple es el azúcar sintáctica para la "cita" la expresión, por lo que 'pavo es lo mismo que (pavo cita). Básicamente, lo que "cita" que hace es apagar el evaluador Esquema. En otras palabras, "cita" devuelve la expresión, palabra por palabra. Si no hubo "cita", entonces Esquema trataría de evaluar "pavo" en el entorno actual. Esto no es una cosa Common Lisp, pero una cosa Lisp. Common Lisp y Scheme son dos dialectos de Lisp. Los usos de la "cita" se explican en todos los tutoriales de Lisp / libros. consulta las respuestas a esta pregunta .

El carácter comilla simple es la forma abreviada de decir (foo cita), donde cita es la forma para volver simplemente foo sin evaluarla.

Una cosa para recordar realmente en el esquema o cualquier Lisp para el caso es que todo lo que se evalúa de forma predeterminada. Así, en los casos en que no desea para evaluar lo que necesita una manera de sentado esto.

Citando algo que hace precisamente esto y la comilla simple es sólo requiere menos escribir y conduce a menos detallado código.

Si la búsqueda de un mejor IDE para scheme y luego ir por Dr Racket. Pero cuando Dr Racket inicio primera línea debe ser #lang scheme desde Dr Racket tiene mucho lengua hemos mencionar explícitamente que el lenguaje que vamos a utilizar.

Cuando queremos pasar un argumento en sí en lugar de pasar el valor del argumento entonces usamos cotización. En su mayoría se relaciona con el paso procedimiento durante el uso de listas, pares y átomos que no están disponibles en la programación C Lenguaje (la mayoría de la gente comienza la programación mediante programación C, ahí nos confundimos) Este es el código en el lenguaje de programación Scheme que es un dialecto de Lisp y creo que se puede 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 lo es para el procedimiento para comprobar si abc es un átomo o no, pero cuando se pasa (átomo? Abc), entonces se comprueba el valor de ABC y passses el valor a la misma. Dado que, no hemos proporcionado ningún valor a la misma

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top