模块中的鸡肉方案(使用)和(导入)不起作用

Chicken scheme (use) and (import) in modules not working

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

所以我有一个包含 2 个文件的目录,foo.scmbar.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.sofoo.import.scm 的文件。这就是所谓的 "import library",其中包含编译模块所需的信息。

这与 C 的 "header file" 相当,并且需要它才能使单独的编译成为可能。例如,在交叉编译的情况下,需要将 import library 加载到 build machine 上的编译器中,但是库本身将被加载到目标机器上的程序中。

您可以在使用 csc.

编译 foo 时使用 -J-j foo 生成此导入文件

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