【问题标题】:Chicken scheme (use) and (import) in modules not working模块中的鸡计划(使用)和(导入)不起作用
【发布时间】:2015-12-16 01:38:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: scheme chicken-scheme


    【解决方案1】:

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

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

    您可以在使用csc 编译foo 时使用-J-j foo 生成此导入文件。

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

    【讨论】:

    • 不,我使用的是 require,因为它是 require-extension 在后台调用的过程。检查山雀。
    • 另外,我试过这个,得到:Error: unbound variable: foo#baz 我需要添加另一个编译,还是什么?我不知道。
    • 如果你得到那个错误,你可能只使用了import;它表明它知道baz 应该解析为foo 模块,但它本身并没有实际的定义(意味着它还没有加载代码)。你需要load(或requireimport(或只是use)。
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2016-09-12
    相关资源
    最近更新 更多