1

假设我有一个库 foofoo.scm像这样:

(module foo (bar)
  (import scheme)

  (define (bar arg)
    (+ 5 arg)))

我有一个程序program.scm

(use foo)

(display (bar 2))

现在,我使用 编译 foo 并生成导入库csc -J -library foo.scm,然后使用csc program.scm. 运行程序按预期显示“7”,一切正常。但是,我想在解释器(csi)中以交互方式加载程序,但现在由于某种原因,每次调用 foo 中的函数都必须加上前缀foo#,即在解释器中(foo#bar 2)有效,但(bar 2)即使它在使用时也不起作用一个源文件。

为什么是这样?这不仅有点烦人,我还担心我可能对模块系统在 Chicken 中的工作方式有误解,所以任何澄清都将不胜感激。

4

1 回答 1

1

我不确定“将程序加载到解释器中”是什么意思,但通常(use foo)应该加载和导入库,所以执行(load "program.scm")应该做到这一点,并且所有导出的东西foo都应该在顶层可用。

听起来您以某种方式最终遇到了库已加载到正在运行的系统中但尚未导入以供在顶层使用的情况。只需在 REPL 中键入(use foo)(甚至(import foo))即可解决此问题。

CHICKEN 的模块系统被设计为允许单独编译,这使得交叉编译成为可能。为了完成这项工作,导入库和实际实现已经分开,但这会使事情变得有些复杂,正如您所发现的那样。这是必需的,因为导入库可能会定义编译时需要的宏,因此它需要在交叉编译主机上运行,​​而库本身需要在交叉编译目标的体系结构中可用。我们正在讨论如何为 CHICKEN 5 简化这一点,因为这会使许多初学者(有时也包括高级用户)感到困惑。

于 2015-04-22T08:53:39.250 回答