scheme - 模块中的鸡肉方案(使用)和(导入)不起作用

标签 scheme chicken-scheme

我在几个项目中遇到过这个问题,但是这个测试用例删除了理解这个问题所不需要的一切。我一直在用它来找出问题所在:

所以我有一个包含 2 个文件的目录,foo.scmbar.scm:

;;;foo.scm
(module foo (baz)
  (import chicken scheme)
  (define (baz)
    (display "bazzer!\n")))

;;;bar.scm
(module baz (quux)
  (import chicken scheme)
  (use foo)
  (define (quux)
    (baz)
    (display "quuxed!\n")))

baz.scm 无法在 csi 中运行并出现此错误:

Error: (import) during expansion of (import ...) - cannot import from undefined module: foo

我检查了文档:use 应该将代码加载到内存中,然后 import 它。我什至运行了 require,函数 use 用于单独加载代码。它运行顺利,只是 import 失败了。我还尝试在 csi 中导入代码。 use 不起作用,但是 require 后跟 import 起作用,即使这应该等同于 use

简而言之,我感到非常困惑。任何人都可以解释发生了什么,以及如何解决它吗?

最佳答案

(use foo)(import foo) 都将尝试加载名为 foo.import.so 的文件foo.import.scm。这就是所谓的“导入库”,其中包含编译模块所需的信息。

这类似于 C 的“头文件”,并且需要它才能使单独的编译成为可能。例如,在交叉编译的情况下,需要将import library加载到build machine上的编译器中,但库本身 strong> 将加载到目标机器 上的程序中。

在使用 csc 编译 foo 时,您可以使用 -J-j foo 生成此导入文件。

require 过程在运行时运行,这意味着它更像 load 而不是 use。我认为您将它与 require-extension 混淆了,后者类似于 use

关于scheme - 模块中的鸡肉方案(使用)和(导入)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34302607/

相关文章:

lisp - Scheme中的函数

functional-programming - 如何在PLT方案中制作模块?

function - 如何定义可变参数函数

linux - 不同终端的不同 nCurses 行为

emacs - 在 Emacs 中运行 Chicken Schedule 时遇到问题

scheme - Racket 上的回溯问题

scheme - 为方案中的变量赋值

lisp - 搜索包含 lists 或 conses 的列表

scheme - Chez 方案可以生成编译的二进制文件吗?

scheme - 重复过滤后的列表顺序