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