模块中的鸡肉方案(使用)和(导入)不起作用
Chicken scheme (use) and (import) in modules not working
我在几个项目中遇到过这个问题,但是这个测试用例删除了理解问题所不需要的一切。我一直在用它来找出问题所在:
所以我有一个包含 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
的文件。这就是所谓的 "import library",其中包含编译模块所需的信息。
这与 C 的 "header file" 相当,并且需要它才能使单独的编译成为可能。例如,在交叉编译的情况下,需要将 import library 加载到 build machine 上的编译器中,但是库本身将被加载到目标机器上的程序中。
您可以在使用 csc
.
编译 foo 时使用 -J
或 -j foo
生成此导入文件
require
过程在运行时运行,这意味着它更像 load
而不是 use
。我认为您将它与 require-extension
混淆了,就像 use
.
我在几个项目中遇到过这个问题,但是这个测试用例删除了理解问题所不需要的一切。我一直在用它来找出问题所在:
所以我有一个包含 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
的文件。这就是所谓的 "import library",其中包含编译模块所需的信息。
这与 C 的 "header file" 相当,并且需要它才能使单独的编译成为可能。例如,在交叉编译的情况下,需要将 import library 加载到 build machine 上的编译器中,但是库本身将被加载到目标机器上的程序中。
您可以在使用 csc
.
-J
或 -j foo
生成此导入文件
require
过程在运行时运行,这意味着它更像 load
而不是 use
。我认为您将它与 require-extension
混淆了,就像 use
.