我试图恢复用Scheme(PLT-Scheme,使用mzscheme解释器(?)命令行工具)编写的旧(1999或更早)项目.更糟糕的是,我不知道Scheme或Lisp(事实上,我想学习,但这是另一个故事).
我有以下项目的源代码:
现在,在运行代码时,它会出现如下错误消息:
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行.那么,有什么不对?
要运行代码,请执行以下步骤:
c:\PLT).c:\sherman\collects\sherman目录复制到:( c:\PLT\collects\sherman其中c:\sherman包含github存储库的内容).cmd.exe然后跑cd c:\sherman.set PATH=c:\PLT;%PATH%sherman.bat run trivial.s
(require-library "runtime.ss" "sherman") (parameterize ((current-namespace sherman-namespace)) (load "trivial.s")) (current-namespace sherman-namespace)
你能帮我解决一下这个问题吗?
编辑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)
不是答案,而是一些评论太大的笔记.
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.ss
并synrule.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未定义的错误消息.