首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导入相对于主文件的文件,而不是当前目录?((Chez)方案)

如何导入相对于主文件的文件,而不是当前目录?((Chez)方案)
EN

Stack Overflow用户
提问于 2016-10-22 06:20:12
回答 2查看 957关注 0票数 1

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

EN

回答 2

Stack Overflow用户

发布于 2016-10-22 08:33:58

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-22 23:25:25

有几种不同的方法可以完成(我认为)你试图做的事情,但最终它们都可以归结为让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中来执行上述操作,这样您就不必自己键入它。(只有当您不需要在方案中键入一个包装器shell脚本,在运行scheme之前将其session).
  • Write到您的项目目录中时才适用(并且在运行scheme之后可能要将它cd到原始目录)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40186213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档