【问题标题】:Resurrecting old PLT-Scheme project (pre-1999)复活旧的 PLT-Scheme 项目(1999 年之前)
【发布时间】:2012-09-14 22:07:27
【问题描述】:

我正在尝试恢复一个用 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

(我试过PLT-Scheme版本52, 53,103、103p1。早期版本不允许mzscheme -L选项,在项目中使用的sherman.bat脚本中引用了这个选项。后来的版本还有更多代码或选项存在严重问题。)

困难在于,据我所见,list->block 实际上 已定义 - 请参阅:collects/sherman/BLOCK.SS line 48。那么,有什么问题呢?

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

  1. 下载 PLT-Scheme v. 103p1(来自 the old versions download page - 首先关闭 “PLT Scheme is now Racket” 横幅)- 对于 Windows,使用:mz-103p1-bin-i386-win32.zip
  2. 解压缩(例如到目录c:\PLT)。
  3. 将包含内容的c:\sherman\collects\sherman 目录复制到:c:\PLT\collects\sherman(其中c:\sherman 包含github repository 的内容)。
  4. 运行cmd.exe,然后运行cd c:\sherman
  5. set PATH=c:\PLT;%PATH%
  6. sherman.bat run trivial.s
    • 这个命令其实据我理解,相当于:
(需要库“runtime.ss”“谢尔曼”) (参数化((当前命名空间谢尔曼命名空间))(加载“trivial.s”)) (当前命名空间谢尔曼命名空间)
  • 之后,我收到上述错误(MzScheme 版本将报告为 103p1 或其他)。

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

编辑 2:已解决!

对于它可能关心的人,我添加了一个成熟的"How to use this project" instruction on the project page,感谢soegaard's help,详细说明了问题的解决方案。

简而言之:

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)

【问题讨论】:

  • 可能,将相关代码移植到 Racket 会更容易,在每个文件的顶部使用#lang mzscheme
  • @SamTobin-Hochstadt:将各种调用移植到旧库中会不会有困难?根据我的尝试,例如(require-library) 表单(在此项目中广泛使用)甚至在在线 Racket 文档中都找不到?
  • require-library 形式是 require 的古老版本。您可能想阅读文档中的porting guides(例如,其中提到了require-library)。
  • @AsumuTakikawa:啊,搜索了类似的东西,但找不到。非常感谢您的链接,可能会有所帮助!
  • +1 纯粹是因为这个问题写得很好。我完全不知道答案是什么。

标签: scheme racket


【解决方案1】:

不是答案,而是一些注释太大而无法评论。

1. Sanity Check

错误消息显示list-&gt;block 未定义。 确保运行block.ss 中的代码,通过 在block.ss 中插入(display "block.ss is loaded!") 只是为了确保代码已运行。


2. Random Thoughts

文件blocks.ss 开头为:

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

文件“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-&gt;block 未定义的错误消息。

【讨论】:

  • 非常感谢!我已经在runtime.ss 中有一个sherman-namespace 的外观定义,但它看起来不够可疑(尤其是有一些类似的#%list-&gt;block),现在多亏了你,这变得更加可疑:)所以,情况好转了,但是......仍然不是我希望结束的地方......所以我更新了这个问题,如果你有足够的想法来暗示我,我将非常感激......
  • 您究竟是如何尝试运行trivial.s 中的代码的?我相信trivial.s 是词法分析器的输出,所以必须先编译它然后运行它。反引号是一种避免在 Scheme 中编写词法分析器的方法(请参阅自述文件中 Joe 的 cmets)。
  • 啊!好的,您的评论以及查看各种extensions + 一些实验终于为我做了:copy trivial.s trivial.rs &amp;&amp; sherman.bat compile trivial.rs &amp;&amp; sherman.bat run trivial.zo。十分感谢! (并且最后一个带有list-&gt;block 的补丁需要先恢复)
  • 添加了一个成熟的"How to use this project" instruction on the project page,基于所有这些。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 2015-07-14
  • 2012-11-23
  • 2012-09-15
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多