我在几个项目中遇到过这个问题,但是这个测试用例删除了理解这个问题所不需要的一切。我一直在用它来找出问题所在:
所以我有一个包含 2 个文件的目录,foo.scm
和 bar.scm
:
;;;foo.scm
(module foo (baz)
(import chicken scheme)
(define (baz)
(display "bazzer!\n")))
;;;bar.scm
(module baz (quux)
(import chicken scheme)
(use foo)
(define (quux)
(baz)
(display "quuxed!\n")))
baz.scm 无法在 csi 中运行并出现此错误:
Error: (import) during expansion of (import ...) - cannot import from undefined module: foo
我检查了文档:use
应该将代码加载到内存中,然后 import
它。我什至运行了 require
,函数 use
用于单独加载代码。它运行顺利,只是 import
失败了。我还尝试在 csi
中导入代码。 use
不起作用,但是 require
后跟 import
起作用,即使这应该等同于 use
。
简而言之,我感到非常困惑。任何人都可以解释发生了什么,以及如何解决它吗?
最佳答案
(use foo)
和 (import foo)
都将尝试加载名为 foo.import.so
或 的文件foo.import.scm
。这就是所谓的“导入库”,其中包含编译模块所需的信息。
这类似于 C 的“头文件”,并且需要它才能使单独的编译成为可能。例如,在交叉编译的情况下,需要将import library加载到build machine上的编译器中,但库本身 strong> 将加载到目标机器 上的程序中。
在使用 csc
编译 foo 时,您可以使用 -J
或 -j foo
生成此导入文件。
require
过程在运行时运行,这意味着它更像 load
而不是 use
。我认为您将它与 require-extension
混淆了,后者类似于 use
。
关于scheme - 模块中的鸡肉方案(使用)和(导入)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34302607/