如何导入相对于主文件而不是当前目录的文件? ((Chez)计划)

时间:2016-10-21 22:20:12

标签: import scheme chez-scheme

例如,在我的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特有的。如果不是,我更喜欢一个与实现无关的答案。

2 个答案:

答案 0 :(得分:1)

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

由于Chez Scheme实现了R6RS,load实际上并不是正确的形式。 R6RS删除load以支持库。您应该将文件设为库并查阅如何安装它。在一些系统中,只是将文件放在正确的路径中,在配置中添加库位置或运行安装脚本。通过使用import

,在所有实现中,使用库的方式都是相同的

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

来查看其扫描的路径

答案 1 :(得分:0)

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

然而,听起来main.scm不是图书馆,它是一个顶级程序。不幸的是,Chez没有命令行选项来设置source-directories,就像它对库目录一样。这会让你的灵活性降低一些。以下任何一种都可以使用:

  • 使util.scm成为库并使用--libdirs选项调用Chez,让它知道在哪里查找库。
  • 设置source-directories并从REPL内部加载main.scm,而不是从命令行加载。{/ li>
  • 编写一个包装器shell脚本,通过将命令回显到scheme来执行上述操作,因此您无需自行键入。 (仅在您不需要输入方案会话时才适用)。
  • 在运行cd之前,将scheme的包装器shell脚本编写到项目目录中(大概完成后,可能会cd回到原始目录。)