scheme sicp dr.racket

scheme - ¿Qué paquete lang es adecuado para SICP en Dr.Racket?



(3)

Estoy tratando con SICP y tengo un código. Así que empecé con:

#lang scheme (word ''comp ''uter)

Error devuelto: Función (palabra) indefinida.

Incluso si intenté copiar esto en IDE (Ejecutar):

(define word? (let ((number? number?) (symbol? symbol?) (string? string?)) (lambda (x) (or (symbol? x) (number? x) (string? x)))))

Siempre lo mismo.

Creo que puede ser cierto problema con la versión del lenguaje o de lo contrario.

Los anteriores son de "Simply Scheme" y cuando introduzco el código exactamente en SICP:

(define (sqrt x) (sqrt-iter 1.0 x))

IDE devolvió sqrt-iter undefined. El código se puede encontrar en el capítulo uno: http://mitpress.mit.edu/sicp/code/index.html


En DrRacket hay un lenguaje de compatibilidad SICP.

1. Desde el Administrador de paquetes

En la documentation hay una guía fácil de cómo se instala desde DrRacket:

  1. Abra el Administrador de paquetes: en DrRacket elija el menú "Archivo" y luego elija "Administrador de paquetes ...".

  2. En la pestaña "Haz lo que quiero decir", busca el campo de texto y escribe: "sicp"

  3. Haga clic en el botón "Instalar". Esto produce mucha salida. No te preocupes por eso incluso cuando hay advertencias.

  4. Pruébalo. Asegúrese de que DrRacket tenga "Determine el idioma de la fuente" en la esquina inferior izquierda. Escribe el siguiente programa y haz clic en EJECUTAR :

    #lang sicp (inc 42) ; ==> 43

Aquí hay una prueba más avanzada que usa el idioma de la imagen, que debe incluirse con #%require :

#lang sicp (#%require sicp-pict) (paint-hires (below (beside diagonal-shading (rotate90 diagonal-shading)) (beside (rotate270 diagonal-shading) (rotate180 diagonal-shading))))

Haga clic en EJECUTAR y debería ver un cuadrado en la ventana de interacciones que se vuelve más brillante hacia el centro.

2 instalacion de linea de comandos

Alternativamente, también puede realizar los pasos 1-3 desde un terminal / shell ejecutando lo siguiente:

raco pkg install sicp

A partir de aquí, realice el paso 4. en la primera instrucción de instalación para probarlo.

3. Versiones anteriores o DrRacket usando planet si el raco pkg no funcionó

En DrRacket también hay una versión anterior del lenguaje de compatibilidad SICP . Mientras tiene el cuadro de selección en la parte inferior izquierda en "Determinar el idioma de la fuente", puede agregar:

#lang planet neil/sicp

como la única línea en las definiciones (área de texto superior) y presione RUN y se instalará. Reinicie DrRacket y lo encontrará disponible en el menú desplegable de idioma. Buena suerte. Puede obtener muchos mensajes de error en rojo. Solo ignóralo y reinicia DrRacket. Es posible que ya no encuentre la opción en el menú de idiomas, pero al comenzar cada archivo con #lang planet neil/sicp , todavía funciona como un idioma de módulo.

A juzgar por los errores, parece estar relacionado con el módulo de lenguaje de imagen. He probado este sniplet y todavía funciona:

(paint-hires (below (beside diagonal-shading (rotate90 diagonal-shading)) (beside (rotate270 diagonal-shading) (rotate180 diagonal-shading))))


[Buen comienzo; Sigue, disfrutarás de Scheme!]

En el esquema, los programas se desarrollan en un entorno. El entorno define una asignación de identificadores a valores. Algunos de los valores son funciones, otros son números, etc. Cuando define una función:

(define (sqrt x) (sqrt-iter 1.0 x))

el identificador x está vinculado como argumento a sqrt , el valor 1.0 es un número y el identificador sqrt-iter proviene del entorno.

Una pregunta que debe hacerse es "¿dónde se define sqrt-iter ; a qué está vinculado?" Dado que no está definido por usted, sqrt-iter debe provenir de un entorno integrado en su Esquema o importado a su Esquema. No ha importado nada y sqrt-iter no está definido en Esquema (vea los recursos para R5RS u otros). Por lo tanto, sqrt-iter no está consolidado.

La misma lógica se aplica a todos los identificadores, incluido el uso de la word .

¿En tu implementación de la word? La palabra clave sintáctica let se usa para introducir nuevos identificadores de límite. Cuando escribe (number? number?) ¿Está introduciendo un nuevo number? identificador number? (a la izquierda) y enlazándolo a number? (a la derecha) procedente del entorno (se define en Esquema). Usar let para esto no es realmente comprarte nada. ¿Tu código por word? podría ser implementado como:

(define (word? x) (or (symbol? x) (number? x) (string? x))) ;; number?


La respuesta de Sylwester fue lo que quería. Sin embargo, me he dado cuenta de que Racket 6.5 ha agregado soporte directo para SICP . Creo que la gente puede querer saber eso.

Ahora se puede escribir código como el siguiente en Racket después de agregar el soporte de SICP:

#lang sicp (#%require sicp-pict) (paint einstein)