例如,在我的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特有的。如果不是,我更喜欢一个与实现无关的答案。
答案 0 :(得分:1)
load
在R5RS中有点尴尬,因为报告指出系统接口在报告中不在主题,但它们包括load
这是一个半心半意的解决方案。该报告没有说明load
是否相对于当前目录或load
表单源自哪个文件,因此为了便携,我想您需要从当前目录运行脚本,让你加载的文件相对于两者。
由于Chez Scheme实现了R6RS,load
实际上并不是正确的形式。 R6RS删除load
以支持库。您应该将文件设为库并查阅如何安装它。在一些系统中,只是将文件放在正确的路径中,在配置中添加库位置或运行安装脚本。通过使用import
。
根据Chez documentation,您可以将--libdirs
传递给它,以便为加载库提供一个或多个路径。您可以通过评估(library-directories)
答案 1 :(得分:0)
有几种不同的方法来完成你想要做的事情(我认为),但最终他们都归结为让Chez知道在哪里寻找东西。给定相对路径时,include
和load
使用source-directories
参数搜索请求的文件。库在加载或编译时会自动将其路径预先添加到source-directories
,因此,如果您的main.scm
是库定义,那么它会找到您所期望的util.scm
。
然而,听起来main.scm
不是图书馆,它是一个顶级程序。不幸的是,Chez没有命令行选项来设置source-directories
,就像它对库目录一样。这会让你的灵活性降低一些。以下任何一种都可以使用:
util.scm
成为库并使用--libdirs
选项调用Chez,让它知道在哪里查找库。source-directories
并从REPL内部加载main.scm
,而不是从命令行加载。{/ li>
scheme
来执行上述操作,因此您无需自行键入。 (仅在您不需要输入方案会话时才适用)。cd
之前,将scheme
的包装器shell脚本编写到项目目录中(大概完成后,可能会cd
回到原始目录。)