2012-09-22 845 views
5

Estoy intentando resucitar un proyecto antiguo (1999 o anterior) escrito en Scheme (PLT-Scheme, usando la herramienta de línea de comandos mzscheme (?) Para empeorar las cosas, no sé Scheme, o Lisp (de hecho, quiero aprender, pero esa es otra historia).Resurrecting old PLT-Scheme project (pre-1999)

que tienen el código fuente del proyecto en:

github.com/akavel/sherman

Ahora, cuando se ejecuta el código, se rescata con un mensaje de error, como a continuación:

Sherman runtime version 0.5 
Hosted on MzScheme version 52, Copyright (c) 1995-98 PLT (Matthew Flatt) 
reference to undefined identifier: list->block 

(He intentado las versiones PLT-Scheme 52, 53, 103, 103p1. Las versiones anteriores no permiten la opción mzscheme -L, que es ref Erenced en el script sherman.bat utilizado en el proyecto. Las versiones posteriores también tienen algunos problemas más graves con el código o las opciones)

La dificultad es, que por lo que veo, list->block realidad es definido - véase:. collects/sherman/BLOCK.SS line 48. Entonces, ¿qué está mal?

Para ejecutar el código, realice los siguientes pasos:.

  1. Descargar PLT-Esquema V 103p1 (de the old versions download page - en primer lugar el cierre de la "PLT Scheme está ahora Raqueta" banner) - para Windows, uso: mz-103p1-bin-i386-win32.zip.
  2. Descomprimir (por ejemplo, en el directorio c:\PLT).
  3. Copie c:\sherman\collects\sherman directorio con contenido a: c:\PLT\collects\sherman (donde c:\sherman contiene el contenido de github repository).
  4. Ejecute cmd.exe, luego cd c:\sherman.
  5. set PATH=c:\PLT;%PATH%
  6. sherman.bat run trivial.s
    • este comando es, de hecho, por lo que entiendo, lo que equivale a:
 
(require-library "runtime.ss" "sherman") 
(parameterize ((current-namespace sherman-namespace)) (load "trivial.s")) 
(current-namespace sherman-namespace) 
  • Después de eso, me sale el error como se describe arriba (la versión de MzScheme sería reportada como 103p1 o lo que sea).

¿Podría ayudarme a resolver el problema?

EDIT 2: SOLVED!

Para quien pueda interesar, he añadido un hecho y derecho "How to use this project" instruction on the project page, que detalla la solución al problema gracias a soegaard's help.

En resumen:

copy trivial.s trivial.rs 
rem (the above is workaround for problems with 'r2s.exe <trivial.r> trivial.rs') 
sherman.bat compile trivial.rs 
sherman.bat run trivial.zo 
rem (or: sherman.bat run trivial.ss) 
+1

Probablemente, sería más fácil transferir el código relevante a Racket, usando '#lang mzscheme' en la parte superior de cada archivo. –

+0

@ SamTobin-Hochstadt: ¿No tendré dificultades para transferir varias llamadas a bibliotecas antiguas? Por lo que probé, p. el formulario '(require-library)' (usado extensivamente en este proyecto) ni siquiera se puede encontrar en los documentos en línea de Racket? – akavel

+1

El formulario 'require-library' es una versión antigua de' require'. Probablemente quiera leer las [guías de portabilidad] (http://docs.racket-lang.org/release/index.html) en los documentos (que mencionan 'require-library', por ejemplo). –

Respuesta

5

No es una respuesta, pero algunas notas demasiado grande para un comentario.

1. Sanity Check 

El mensaje de error dice list->block no está definido. Asegúrese de que el código en block.ss se ejecuta, por insertando (display "block.ss is loaded!") en block.ss solo para asegurarse de que se ejecuta el código.


2. Random Thoughts 

El archivo blocks.ss comienza con:

(require-library "functios.ss") 
(require-library "synrule.ss") 
(require-library "stream.ss" "sherman") 

El archivo "Sherman/stream.ss" está en el repositorio, pero ¿dónde está "synrule.ss" y "functios. ss "?

Ah ... ¡Este código es antiguo! Aquí está una descripción de cómo trabajó require-library. Enumera functios.ss y synrule.ss como parte de MzLib.

http://www.informatik.uni-kiel.de/~scheme/doc/mzscheme/node158.htm

vamos a ver cómo require-library trabajaron:

Cuando requerir-biblioteca se utiliza para cargar un archivo, el nombre de la biblioteca y el valor resultante (s) se recored en una tabla asociada con el espacio de nombres actual . Si require-library se evalúa para una biblioteca que está ya registrada en la tabla de carga del espacio de nombres actual, entonces la biblioteca no se carga de nuevo; el resultado (s) registrado en la tabla de carga se devuelve, en su lugar.

De modo que cuando se ejecuta el código en block.ss, los nombres se almacenan en un espacio de nombres. Si el espacio de nombres actual es incorrecto, cuando se evalúa el código en block.ss, le explicaría que el mensaje de error list->block no está definido.

+0

¡Muchas gracias! Ya tuve una definición de búsqueda de 'sherman-namespace' en 'runtime.ss', pero no parecía lo suficientemente sospechosa (especialmente que había un poco similar' #% list-> block'), y ahora gracias a ti esto se volvió más sospechoso :) Entonces, la situación mejoró, pero ... todavía no era exactamente donde esperaba terminar ... así que actualicé la pregunta, y estaría muy agradecido si quisieras lo suficiente para tal vez darme una pista un poco más ... – akavel

+1

¿Cómo exactamente trataste de ejecutar el código en 'trivial.s'? Creo que 'trivial.s' es la salida del lexer, por lo que primero hay que compilarlo y luego ejecutarlo. La cosa de la contrafija es una forma de evitar escribir el lexer en Scheme (ver los comentarios de Joe en el archivo léame). – soegaard

+0

AHH! Ok, tu comentario junto con mirar varias 'extensiones' + algo de experimentación finalmente lo hizo por mí:' copy trivial.s trivial.rs && sherman.bat compilar trivial.rs && sherman.bat ejecutar trivial.zo'. ¡MUCHAS GRACIAS! (Y el último parche con 'list-> block' necesita ser revertido primero) – akavel