首页 文章

创建一个可从csi访问的库

提问于
浏览
1

假设我在_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 回答

  • 1

    我不确定你的意思"load the program into the interpreter",但通常 (use foo) 应该加载并导入库,所以执行 (load "program.scm") 应该这样做, foo 导出的所有东西都应该在顶层可用 .

    听起来你最终会出现这样一种情况:库已经被加载到正在运行的系统中,但是还没有被导入以便在顶层使用 . 只需在REPL键入 (use foo) (或甚至 (import foo) )就可以解决此问题 .

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

相关问题