假设我在foo.scm
中有一个库foo,就像这样:
(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中的工作方式,所以任何澄清都会非常感激。
答案 0 :(得分:1)
我不确定“将程序加载到解释器”是什么意思,但通常(use foo)
应加载并导入库,因此执行(load "program.scm")
应该只是这样做,并且所有foo
导出的内容应该在toplevel上提供。
听起来你最终会出现这样一种情况,即图书馆已加载到正在运行的系统中,但尚未导入以供在顶层使用。只需在REPL键入(use foo)
(或甚至(import foo)
)就可以解决此问题。
CHICKEN的模块系统设计用于单独编译,这使得交叉编译成为可能。为了使这个工作,导入库和实际实现已经分开,但这会使事情变得复杂,正如您所发现的那样。这是必需的,因为导入库可能会定义编译时需要的宏,因此需要在交叉编译主机上运行,而库本身需要在交叉编译目标的体系结构中可用。我们正在讨论如何简化CHICKEN 5,因为这会让很多初学者(有时候也是高级用户)感到困惑。