2012-09-22 7 views
5

Sto tentando di resuscitare un vecchio progetto (1999 o precedente) scritto in Schema (PLT-Scheme, utilizzando lo strumento della riga di comando mzscheme). Per peggiorare le cose, non conosco Scheme, o Lisp (in realtà, voglio imparare, ma questa è un'altra storia).Ripristino del vecchio progetto PLT-Scheme (pre-1999)

Ho il codice sorgente del progetto:

github.com/akavel/sherman

Ora, quando si esegue il codice, balle fuori con un messaggio di errore come di seguito:

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

(Ho provato le versioni dello schema PLT 52, 53, 103, 103p1. Le versioni precedenti non consentono l'opzione mzscheme -L, che è ref inserito nello script sherman.bat utilizzato nel progetto. Le versioni successive hanno anche alcuni problemi più gravi con il codice o le opzioni)

La difficoltà è che, da quello che vedo, in realtà list->blockè definita - vedi:. collects/sherman/BLOCK.SS line 48. Quindi, cosa c'è che non va?

Per eseguire il codice, ho effettuare le seguenti operazioni:.

  1. Scarica PLT-Scheme v 103p1 (da the old versions download page - prima di chiudere la "PLT Scheme è ora Racket" striscione) - per Windows, utilizzare: mz-103p1-bin-i386-win32.zip.
  2. Decomprimere (ad esempio nella directory c:\PLT).
  3. Copia c:\sherman\collects\sherman directory con contenuto a: c:\PLT\collects\sherman (dove c:\sherman contiene il contenuto di github repository).
  4. Eseguire cmd.exe, quindi cd c:\sherman.
  5. set PATH=c:\PLT;%PATH%
  6. sherman.bat run trivial.s
    • questo comando è infatti, da quanto ho capito, equivalente a:
 
(require-library "runtime.ss" "sherman") 
(parameterize ((current-namespace sherman-namespace)) (load "trivial.s")) 
(current-namespace sherman-namespace) 
  • Dopo di che, ottengo l'errore come descritto sopra (la versione di MzScheme sarebbe riportata come 103p1 o qualsiasi altra cosa).

Potrebbe aiutarmi a risolvere il problema?

MODIFICA 2: RISOLTO!

A chi può interessare, Ho una vera e propria "How to use this project" instruction on the project page, dettagliando la soluzione al problema, grazie alla soegaard's help.

In breve:

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

Probabilmente, sarebbe più facile portare il codice rilevante su Racket, usando '#lang mzscheme' nella parte superiore di ciascun file. –

+0

@ SamTobin-Hochstadt: Non avrò difficoltà a trasferire varie chiamate verso le vecchie librerie? Da quello che ho provato, ad es. il modulo '(require-library)' (usato estesamente in questo progetto) non è nemmeno rintracciabile nei documenti del Racket online? – akavel

+1

Il modulo 'require-library' è una versione antica di' require'. Probabilmente vorrai leggere le [guide di porting] (http://docs.racket-lang.org/release/index.html) nei documenti (che menziona 'require-library', ad esempio). –

risposta

5

Non una risposta, ma alcune note troppo grande per un commento.

1. Sanity Check 

Il messaggio di errore dice list->block è indefinito. Assicurarsi che il codice in block.ss venga eseguito, da inserendo (display "block.ss is loaded!") in block.ss solo per essere sicuri, il codice viene eseguito.


2. Random Thoughts 

Il file blocks.ss inizia con:

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

Il file "Sherman/stream.ss" è nel repository, ma dov'è "synrule.ss" e "functios. ss "?

Ah ... Questo codice è vecchio! Ecco una descrizione di come funziona require-library. Elenca functios.ss e synrule.ss come parte di MzLib.

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

Diamo un'occhiata a come require-library lavorato:

Quando richiedere-libreria viene utilizzato per caricare un file, il nome della libreria e il valore risultante (s) sono recored in una tabella associata con lo spazio dei nomi attuale . Se la libreria dei requisiti viene valutata per una libreria che è già registrata nella tabella di caricamento dello spazio dei nomi corrente, la libreria non viene caricata nuovamente; i risultati registrati nella tabella di carico vengono invece restituiti.

Pertanto, quando viene eseguito il codice in block.ss, i nomi vengono memorizzati in uno spazio dei nomi. Se lo spazio dei nomi corrente è errato, quando viene valutato il codice in block.ss, verrà spiegato che il messaggio di errore list->block non è definito.

+0

Grazie mille! Ho già avuto una definizione di 'sherman-namespace' in' runtime.ss', ma non sembrava abbastanza sospetto (specialmente che esisteva un po 'simile '#% list-> block'), e ora grazie a te questo è diventato più sospettoso :) Quindi, la situazione è migliorata, ma ... ancora non esattamente dove speravo di finire ... quindi ho aggiornato la domanda, e sarei molto grato se ti piacesse abbastanza da suggerirmi una un po 'di più ... – akavel

+1

In che modo esattamente hai provato a eseguire il codice in 'trivial.s'? Credo che 'trivial.s' sia l'output del lexer, quindi bisogna prima compilarlo e poi eseguirlo. La cosa di backquote è un modo per evitare di scrivere il lexer in Scheme (vedi i commenti di Joe nel readme). – soegaard

+0

AHH! Ok, il tuo commento insieme a vari 'extension's + alcuni esperimenti finalmente lo ha fatto per me:' copia trivial.s trivial.rs && sherman.bat compile trivial.rs && sherman.bat esegui trivial.zo'. GRAZIE TANTE! (E l'ultima patch con 'Lista-> blocco-deve essere ripristinato prima) – akavel