恢复旧的PLT-Scheme项目(1999年之前)

aka*_*vel 5 scheme racket

我试图恢复用Scheme(PLT-Scheme,使用mzscheme解释器(?)命令行工具)编写的旧(1999或更早)项目.更糟糕的是,我不知道Scheme或Lisp(事实上,我想学习,但这是另一个故事).

我有以下项目的源代码:

github.com/akavel/sherman

现在,在运行代码时,它会出现如下错误消息:

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

(我试过PLT-方案版本52,53, 103,103p1.早期版本不允许mzscheme -L选项,这是在引用的sherman.bat项目中使用脚本.后来的版本也有一些更严重的问题与代码或选项. )

困难在于,从我看到的,list->block实际上定义的 - 见:collects/sherman/BLOCK.SS第48行.那么,有什么不对?

要运行代码,请执行以下步骤:

  1. 下载PLT-Scheme v.103p1(从旧版本下载页面 - 首先关闭"PLT Scheme现在是Racket"横幅) - 对于Windows,请使用:mz-103p1-bin-i386-win32.zip.
  2. 解压缩(例如,到目录c:\PLT).
  3. 将包含内容的c:\sherman\collects\sherman目录复制到:( c:\PLT\collects\sherman其中c:\sherman包含github存储库的内容).
  4. cmd.exe然后跑cd c:\sherman.
  5. set PATH=c:\PLT;%PATH%
  6. sherman.bat run trivial.s
    • 事实上,根据我的理解,这个命令相当于:
(require-library "runtime.ss" "sherman")
(parameterize ((current-namespace sherman-namespace)) (load "trivial.s"))
(current-namespace sherman-namespace)
  • 之后,我得到如上所述的错误(MzScheme版本将报告为103p1或其他).

你能帮我解决一下这个问题吗?

编辑2:解决了!

对于它可能涉及的人,我在项目页面上添加了一个完全成熟的"如何使用此项目"指令,详细说明了问题的解决方案,感谢soegaard的帮助.

简而言之:

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)
Run Code Online (Sandbox Code Playgroud)

soe*_*ard 5

不是答案,而是一些评论太大的笔记.

1. Sanity Check
Run Code Online (Sandbox Code Playgroud)

错误消息显示list->block未定义.确保在代码block.ss运行时,通过插入(display "block.ss is loaded!")block.ss ,以确保公正,该代码运行.


2. Random Thoughts
Run Code Online (Sandbox Code Playgroud)

该文件blocks.ss以:

(require-library "functios.ss")
(require-library "synrule.ss")
(require-library "stream.ss" "sherman")
Run Code Online (Sandbox Code Playgroud)

文件"sherman/stream.ss"在存储库中,但是"synrule.ss"和"functios.ss"在哪里?

啊......这段代码很老了!这是对require-library工作方式的描述.它列出functios.sssynrule.ss作为MzLib的一部分.

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

让我们来看看它是如何require-library工作的:

当使用require-library加载文件时,库名称和结果值将在与当前名称空间关联的表中进行记录.如果对已在当前名称空间的加载表中注册的库评估require-library,则不会再次加载库; 而是返回记录在装入表中的结果.

因此,当block.ss运行代码时,名称存储在命名空间中.如果当前命名空间是错误的,当block.ss评估代码时,它将解释您list->block未定义的错误消息.