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

Import 如何相对于主文件而不是当前目录导入文件?((Chez)计划),import,scheme,chez-scheme,Import,Scheme,Chez Scheme,例如,在我的main.scm文件中,我有(加载“util.scm”)util.scm是与main.scm位于同一文件夹中的文件。这两个文件都位于~/documents/myproject/中 现在,当我在这个目录中运行$chez scheme main.scm时,一切都正常。但是,如果我在我的主目录中运行$chez scheme documents/myproject/main.scm,它会抱怨找不到文件util.scm。我想这是因为当前目录是我的相关主目录,因此util.scm确实不在那里,它

例如,在我的
main.scm
文件中,我有
(加载“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))
操作,但在
文档/myproject/
之外,这些操作都不起作用。有没有办法让它按照我的意愿工作


我认为这是特定于Chez方案的。如果不是,我更喜欢一个与实现无关的答案。

load
在R5R中有点尴尬,因为报告中指出系统接口与报告中的主题无关,但它们包括
load
,这是一个三心二意的解决方案。报告没有说明加载的
是相对于当前目录还是
load
表单的源文件,因此为了便于移植,我想您需要从当前目录运行脚本,并将加载的文件相对于这两个目录

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


根据您可以通过<代码> -Lbdirs<代码>,给它一个或多个路径来考虑加载库。您可以通过评估

(库目录)

来查看它扫描的路径。有几种不同的方法可以完成(我认为)您要做的事情,但最终它们都归结为让Chez知道在哪里查找东西。给定相对路径时,
include
load
使用
源目录
参数搜索请求的文件。在加载或编译库时,库的路径会自动添加到
源目录
,因此,如果
main.scm
是库定义,则它会按预期查找
util.scm

然而,它听起来像是
main.scm
不是一个库,而是一个顶级程序。不幸的是,Chez没有一个命令行选项来设置
源目录
,就像它对库目录所做的那样。这会让你的灵活性降低一点。以下任何一项都有效:

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