创建一个可从csi访问的库

时间:2015-03-10 02:26:23

标签: scheme chicken-scheme

假设我在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中的工作方式,所以任何澄清都会非常感激。

1 个答案:

答案 0 :(得分:1)

我不确定“将程序加载到解释器”是什么意思,但通常(use foo)应加载并导入库,因此执行(load "program.scm")应该只是这样做,并且所有foo导出的内容应该在toplevel上提供。

听起来你最终会出现这样一种情况,即图书馆已加载到正在运行的系统中,但尚未导入以供在顶层使用。只需在REPL键入(use foo)(或甚至(import foo))就可以解决此问题。

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