2012-09-22 1 views
5

Ich versuche, ein altes (1999 oder früher) Projekt in Scheme (PLT-Schema, mit dem mzscheme Interpreter (?) Kommandozeilen-Tool). Um die Sache noch schlimmer zu machen, kenne ich Scheme oder Lisp nicht (ich möchte es sogar lernen, aber das ist eine andere Geschichte).Wiederbeleben altes PLT-Schema-Projekt (vor 1999)

Ich habe den Quellcode des Projekts an:

github.com/akavel/sherman

Nun, wenn der Code ausgeführt wird, es bürgt wie unten mit einer Fehlermeldung aus:

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

(Ich habe versucht, PLT-Schema-Versionen 52, 53, 103, 103p1. Frühere Versionen erlauben mzscheme -L Option, die Ref. Ist In der sherman.bat Skript im Projekt verwendet. Spätere Versionen haben auch einige ernstere Probleme mit dem Code oder Optionen)

Die Schwierigkeit besteht darin, dass von dem, was ich sehe, list->block tatsächlich ist definiert - siehe:. collects/sherman/BLOCK.SS line 48. Also, was ist falsch?

um den Code auszuführen, habe ich die folgenden Schritte aus:.

  1. herunterladen PLT-Scheme v 103p1 (von the old versions download page - zuerst die "PLT Scheme ist jetzt Racket" closing Banner) - für Windows, Verwenden Sie: mz-103p1-bin-i386-win32.zip.
  2. Entpacken (z. B. in das Verzeichnis c:\PLT).
  3. Kopieren c:\sherman\collects\sherman Verzeichnis mit Inhalt zu: c:\PLT\collects\sherman (wo enthält den Inhalt der github repository).
  4. Führen Sie cmd.exe, dann cd c:\sherman.
  5. set PATH=c:\PLT;%PATH%
  6. sherman.bat run trivial.s
    • dieser Befehl ist in der Tat, von dem, was ich verstehe, das entspricht:
 
(require-library "runtime.ss" "sherman") 
(parameterize ((current-namespace sherman-namespace)) (load "trivial.s")) 
(current-namespace sherman-namespace) 
  • Danach habe ich die Fehler wie beschrieben oben (MzScheme-Version würde als 103p1 oder was auch immer gemeldet werden).

Können Sie mir helfen, das Problem zu lösen?

EDIT 2: Gelöst!

Um wen es angeht, habe ich ein vollwertiges "How to use this project" instruction on the project page, hinzugefügt, um soegaard's help die Lösung für das Problem dank Detaillierung.

Kurz:

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

Wahrscheinlich wäre es einfacher, den relevanten Code auf Racket zu portieren, indem Sie '#lang mzscheme' am Anfang jeder Datei verwenden. –

+0

@ SamTobin-Hochstadt: Wird es mir nicht schwer fallen, verschiedene Anrufe in alte Bibliotheken zu portieren? Von dem, was ich versuchte, z. das Formular '(require-library)' (in diesem Projekt häufig verwendet) ist nicht einmal in der Online-Racket-Dokumentation zu finden? – akavel

+1

Das Formular 'require-library' ist eine alte Version von' require'. Wahrscheinlich möchten Sie die [porting guides] (http://docs.racket-lang.org/release/index.html) in den Dokumenten lesen (z. B. "require-library"). –

Antwort

5

keine Antwort, aber ein paar Hinweise für einen Kommentar zu groß.

1. Sanity Check 

Die Fehlermeldung sagt list->block nicht definiert ist. Stellen Sie sicher, dass der Code in block.ss ausgeführt wird, indem Sie einfügen (display "block.ss is loaded!") in block.ss nur um sicherzustellen, dass der Code ausgeführt wird.


2. Random Thoughts 

Die Datei blocks.ss beginnt mit:

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

die Datei "sherman/stream.ss" ist im Repository, aber wo ist "synrule.ss" und „functios. ss "?

Ah ... Dieser Code ist alt! Hier ist eine Beschreibung von wie require-library funktioniert. Es listet functios.ss und synrule.ss als Teil von MzLib auf.

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

Lassen Sie uns prüfen, wie require-library gearbeitet:

Wenn erforderlich-Bibliothek verwendet wird, um eine Datei zu laden, den Namen der Bibliothek und den resultierende Wert (e) werden in einer Tabelle recored zugeordnet mit dem aktuellen Namensraum. Wenn require-library für eine Bibliothek ausgewertet wird, die bereits in der Auslastungstabelle des aktuellen Namespaces registriert ist, wird die Bibliothek nicht erneut geladen. das Ergebnis (die Ergebnisse), die in der Ladungstabelle aufgezeichnet sind, wird stattdessen zurückgegeben.

Wenn also der Code in block.ss ausgeführt wird, werden die Namen in einem Namespace gespeichert. Wenn der aktuelle Namespace der falsche ist, wenn der Code in block.ss ausgewertet wird, würde es Ihnen erklären, dass die Fehlermeldung list->block nicht definiert ist.

+0

Vielen Dank! Ich hatte bereits eine Definition von 'sherman-namespace' in' runtime.ss', aber es sah nicht misstrauisch genug aus (insbesondere, dass es irgendeine Art von '#% list-> block' gab), und jetzt Dank dir wurde das misstrauischer :) Also, die Situation wurde besser, aber ... immer noch nicht genau, wo ich gehofft habe zu enden ... also habe ich die Frage aktualisiert, und wäre sehr dankbar, wenn du genug hättest, um mir vielleicht einen zu geben Bit mehr ... – akavel

+1

Wie genau haben Sie versucht, den Code in 'trivial.s' laufen zu lassen? Ich glaube, 'trivial.s' ist die Ausgabe des Lexers, also muss man es zuerst kompilieren und dann ausführen. Die Backquote-Sache ist eine Möglichkeit zu vermeiden, den Lexer in Scheme zu schreiben (siehe Joe's Kommentare in der Readme). – soegaard

+0

AHH! Ok, dein Kommentar zusammen mit dem Blick auf verschiedene 'Extensions' + einige Experimente haben es schließlich für mich geschafft: 'kopiere trivial.s trivial.rs && sherman.bat kompiliere trivial.rs && sherman.bat run trivial.zo'. VIELEN DANK! (Und der letzte Patch mit 'list-> block 'muss zuerst zurückgesetzt werden) – akavel