Scheme 创建可从csi访问的库

Scheme 创建可从csi访问的库,scheme,chicken-scheme,Scheme,Chicken Scheme,假设我在foo.scm中有一个库foo,如下所示: (module foo (bar) (import scheme) (define (bar arg) (+ 5 arg))) 我有一个程序。scm (use foo) (display (bar 2)) 现在,我编译foo并使用csc-J-library foo.scm生成导入库,然后使用csc program.scm编译程序。运行程序显示“7”,一切正常。然而,我想在解释器(csi)中以交互方式加载程序,但出于某种原

假设我在
foo.scm
中有一个库foo,如下所示:

(module foo (bar)
  (import scheme)

  (define (bar arg)
    (+ 5 arg)))
我有一个程序。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中的模块系统是如何工作的,因此希望您能给予澄清。

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

听起来好像您最终遇到了这样一种情况:库已加载到正在运行的系统中,但尚未导入以供顶级使用。只需在REPL处键入
(使用foo)
(甚至
(导入foo)
)即可解决此问题

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