Scheme 重建旧公共小巴计划项目(1999年前)

Scheme 重建旧公共小巴计划项目(1999年前),scheme,racket,Scheme,Racket,我正在尝试恢复一个用Scheme(PLT Scheme,使用mzschemeinterpreter(?)命令行工具)编写的旧项目(1999年或更早)。更糟糕的是,我不知道Scheme或Lisp(事实上,我想学习,但那是另一个故事) 我的项目源代码位于: 现在,当运行代码时,它会跳出一条错误消息,如下所示: Sherman runtime version 0.5 Hosted on MzScheme version 52, Copyright (c) 1995-98 PLT (Matthew F

我正在尝试恢复一个用Scheme(PLT Scheme,使用
mzscheme
interpreter(?)命令行工具)编写的旧项目(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
(我尝试过PLT方案版本103、103p1。早期版本不允许
mzscheme-L
选项,该选项在项目中使用的
sherman.bat
脚本中引用。更高版本的代码或选项也有一些更严重的问题。)

困难在于,从我所看到的,
list->block
实际上是定义的-参见:。那么,怎么了

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

  • 下载PLT方案五。103p1(从-第一次关闭“PLT方案现在是球拍”横幅)-对于Windows,使用:
  • 解压(例如,到目录
    c:\PLT
  • c:\sherman\collects\sherman
    目录及其内容复制到:
    c:\PLT\collects\sherman
    (其中
    c:\sherman
    包含目录的内容)
  • 运行
    cmd.exe
    ,然后运行
    cd c:\sherman
  • set PATH=c:\PLT;%路径%
  • sherman.bat运行平凡的.s
    • 据我所知,这个命令实际上相当于:
  • (需要库“runtime.ss”“sherman”) (参数化((当前名称空间sherman名称空间))(加载“little.s”)) (当前名称空间sherman名称空间)
    • 在那之后,我得到了如上所述的错误(MzScheme版本将被报告为103p1或其他类型)
    你能帮我解决这个问题吗

    编辑2:已解决

    对于它可能涉及的人,我已经添加了一个完整的、详细的问题解决方案,感谢

    简言之:

    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)
    
    复制平凡的.s平凡的.rs
    rem(以上是针对“r2s.exetriatile.rs”问题的解决方法)
    sherman.bat.rs
    sherman.bat run triple.zo
    rem(或:sherman.bat run triple.ss)
    
    不是答案,但有几个注释太大,不适合评论

    1. Sanity Check
    
    错误消息显示
    list->block
    未定义。 确保
    block.ss
    中的代码已按运行 在
    block.ss中插入
    (显示“block.ss已加载!”)
    只是为了确保代码已运行


    文件
    blocks.ss
    以以下内容开头:

    (require-library "functios.ss")
    (require-library "synrule.ss")
    (require-library "stream.ss" "sherman")
    
    文件“sherman/stream.ss”位于存储库中, 但是“synrule.ss”和“functios.ss”在哪里呢

    啊。。。这个代码是旧的!下面是对
    require库的工作方式。它列出了
    functios.ss
    synrule.ss
    作为MzLib的一部分

    让我们看看
    require库的工作原理:

    当使用require library加载文件时,库名称和 结果值记录在与当前值关联的表中 命名空间。如果需要库,则为 已在当前命名空间的加载表中注册,则 库未再次加载;负荷表中记录的结果 而是返回


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

    可能,将相关代码移植到Racket会更容易,在每个文件的顶部使用
    #lang mzscheme
    。@SamTobin Hochstadt:将各种调用移植到旧库不是有困难吗?根据我的尝试,例如
    (require library)
    表单(在本项目中广泛使用)甚至在在线Racket文档中都找不到?
    require library
    表单是
    require
    的一个古老版本。您可能想阅读文档中的内容(例如,其中提到了
    要求库
    )@Asumotakawa:啊,搜索了类似的内容,但找不到。非常感谢您的链接,可能会有所帮助+1纯粹是因为这个问题写得很好。我完全不知道答案是什么。非常感谢!我已经在
    runtime.ss
    中查看了
    谢尔曼名称空间的定义,但它看起来不够可疑(特别是有一些类似的
    #%list->block
    ),现在多亏了您,这变得更加可疑:)所以,情况有所好转,但。。。仍然不完全是我希望结束的地方。。。所以我更新了这个问题,如果你想再给我一点提示的话,我将非常感激……你到底是如何尝试在
    triple.s
    中运行代码的?我相信
    triple.s
    是lexer的输出,因此必须先编译它,然后运行它。反向引用是一种避免在Scheme中编写lexer的方法(参见自述文件中Joe的评论)!好的,您的评论以及查看各种
    扩展
    s+一些实验终于为我做到了:
    复制triple.s triple.rs&&sherman.bat编译triple.rs&&sherman.bat运行triple.zo
    。非常感谢!(最后一个带有
    list->block
    的补丁需要先恢复)添加了一个完全成熟的补丁,基于所有这些。
    2. Random Thoughts
    
    (require-library "functios.ss")
    (require-library "synrule.ss")
    (require-library "stream.ss" "sherman")