例如,在我的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的。如果不是,我更喜欢一个与实现无关的答案。
发布于 2016-10-22 08:33:58
load在R5RS中有点尴尬,因为报告指出系统接口在报告中是离题的,但其中包括load,这是一个半心半意的解决方案。报告没有说明load是相对于当前目录还是load表单所在的文件,所以为了便于移植,我猜您需要从当前目录运行脚本,并将加载的文件与这两个目录相关联。
由于Chez方案实现了R6RS,因此load并不是真正适合使用的形式。R6RS删除了load,转而使用库。你应该使你的文件成为一个库,并咨询如何安装它。在某些系统中,只是将文件放在正确的路径中,在配置中添加库位置或运行安装脚本。通过使用import,在所有实现中使用库的方式都是相同的。
根据Chez documentation的说法,您可以将--libdirs传递给它,以便为它提供一个或多个路径以供其在加载库时考虑。您可以通过评估(library-directories)来查看它扫描的路径
发布于 2016-10-22 23:25:25
有几种不同的方法可以完成(我认为)你试图做的事情,但最终它们都可以归结为让Chez知道在哪里寻找东西。当给定相对路径时,include和load使用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).scheme之后可能要将它cd到原始目录)。https://stackoverflow.com/questions/40186213
复制相似问题