3

我在几个项目中都遇到过这个问题,但是这个测试用例删除了理解问题所不需要的一切。我一直在用它来找出问题所在:

所以我有一个目录,里面有 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.

简而言之,我感到非常困惑。任何人都可以解释发生了什么,以及如何解决它?

4

1 回答 1

0

(use foo)两者(import foo)都会尝试加载一个名为foo.import.soor的文件foo.import.scm。这是一个所谓的“导入库”,其中包含编译模块所需的信息。

这相当于 C 的“头文件”,为了使单独编译成为可能,需要它。例如,在交叉编译的情况下,需要将导入库加载到构建机器上的编译器中,但库本身将被加载到目标机器上的程序中。

您可以使用-J-j foo在编译 foo 时使用csc.

require过程在运行时工作,这意味着它更像是load而不是 like use。我认为您将其与 混淆了require-extension,就像use.

于 2015-12-16T20:47:39.480 回答