【问题标题】:How to import files relative to main file, instead of current directory? ((Chez) Scheme)如何导入相对于主文件而不是当前目录的文件? ((切斯)计划)
【发布时间】:2017-03-04 07:54:54
【问题描述】:

例如,在我的main.scm 文件中,我有(load "util.scm")util.scm 是与main.scm 在同一文件夹中的文件。这两个文件都位于~/documents/myproject/

现在,当我在这个目录中时,我运行 $ chez-scheme main.scm 一切正常。但是,如果我在我的主目录中运行$chez-scheme documents/myproject/main.scm,它会抱怨,找不到文件util.scm。我想是这样的,因为当前目录是我相关的主目录,因此util.scm 确实不存在,它实际上在documents/myproject/ 中。话虽这么说,我已经习惯(在其他语言中)相对于包含导入指令的文件查找这些路径的功能,我也想在这里拥有它。我试过在它前面加上./ 或将文件定义为库并执行(import (util)),但它在documents/myproject/ 之外都不起作用。有什么办法可以让它按我的意愿工作吗?

我认为这是 Chez-Scheme 特有的。如果不是,我更喜欢实现中立的答案。

【问题讨论】:

    标签: import scheme chez-scheme


    【解决方案1】:

    有几种不同的方法可以完成(我认为)您正在尝试做的事情,但最终它们都归结为让 Chez 知道在哪里寻找东西。当给定相对路径时,includeload 使用source-directories 参数来搜索请求的文件。库在加载或编译时会自动将其路径添加到source-directories,因此如果您的main.scm 是库定义,那么它会如您所愿找到util.scm

    但是,听起来main.scm 不是库,而是顶级程序。不幸的是,Chez 没有像设置库目录那样设置source-directories 的命令行选项。这使您的灵活性降低了一些。以下任何一项都可以:

    • util.scm 设为库并使用 --libdirs 选项调用 Chez,让它知道在哪里查找库。
    • 从 REPL 内部而不是从命令行设置 source-directories 并加载 main.scm
    • 通过将命令回显到scheme 中来编写执行上述操作的包装器外壳脚本,这样您就不必自己输入了。 (仅适用于您不需要再键入方案会话的情况)。
    • 在运行scheme 之前,将cds 的包装器shell 脚本写入您的项目目录(并在完成后将cds 返回到原始目录)。

    【讨论】:

      【解决方案2】:

      load 在 R5RS 中有点尴尬,因为报告指出系统接口不在报告中,但它们包括 load,这是一个半心半意的解决方案。该报告没有说明 load 是否相对于当前目录或 load 表单源自的文件,所以为了便于移植,我猜您需要从当前目录运行脚本并加载文件相对于两者。

      由于 Chez Scheme 实现了 R6RS,load 并不是真正适合使用的形式。 R6RS 删除了 load 以支持库。您应该使您的文件成为一个库并咨询如何安装它。在某些系统中,只是将文件放置在正确的路径中,在配置中添加库位置或运行安装脚本。通过使用import,在所有实现中使用库的方式都是相同的。

      根据Chez documentation,您可以将--libdirs 传递给它,为其提供一个或多个加载库的路径。你可以通过评估(library-directories)来查看它扫描的路径

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 2021-07-21
        • 2015-02-12
        相关资源
        最近更新 更多