假设我在foo.scm中有一个库foo,如下所示:
(module foo (bar)
(import scheme)
(define (bar arg)
(+ 5 arg)))我有一个程序program.scm
(use foo)
(display (bar 2))现在,我使用csc -J -library foo.scm编译foo并生成导入库,然后使用csc program.scm编译程序。运行程序显示"7",正如预期的那样,一切都很棒。然而,我想在解释器(csi)中以交互方式加载程序,但现在由于某种原因,每次调用foo中的函数都必须以foo#为前缀,即在解释器中(foo#bar 2)可以工作,但(bar 2)即使在源文件中使用也不能工作。
为什么会这样呢?这不仅有点烦人,我还担心我可能对Chicken中的模块系统的工作方式有误解,所以任何澄清都会非常感谢。
发布于 2015-04-22 16:53:39
我不确定您所说的“将程序加载到解释器中”是什么意思,但是通常(use foo)应该加载和导入库,所以执行(load "program.scm")应该就是这样做的,并且foo导出的所有内容都应该在toplevel上可用。
听起来您似乎以某种方式结束了这样一种情况:库已加载到正在运行的系统中,但尚未导入以供在toplevel使用。只需在REPL中输入(use foo) (甚至是(import foo))就可以解决这个问题。
CHICKEN的模块系统被设计为允许单独编译,这使得交叉编译成为可能。为了实现这一点,导入库和实际实现是分开的,但正如您所发现的,这会使事情变得有点复杂。这是必要的,因为导入库可能定义编译时需要的宏,因此它需要在交叉编译主机上运行,而库本身需要在交叉编译目标的体系结构中可用。我们正在讨论如何简化鸡5,因为这是许多初学者(有时也包括高级用户)感到困惑的事情。
https://stackoverflow.com/questions/28955158
复制相似问题