如何在 Guile 中定义两个 R7RS 库

How to define two R7RS libraries in Guile

我有这两个R7RS库,一一进入Guile REPL:

(define-library (example one)
  (import (scheme base))
  (export f)
  (begin
    (define (f x)
      (+ x 1))))

(define-library (example two)
  (import (scheme base))
  (export g)
  (begin
    (define (g x)
      (* x 2))))

当我在 Guile REPL 中输入第二个库定义时,出现此错误:

While compiling expression:
Syntax error:
unknown file:13:4: definition in expression context, where definitions are not allowed, in form (define (g x) (* x 2))

我试图将两个库放入同一个文件 (mylibs.sld) 和 运行 guile mylibs.sld,但我得到了完全相同的错误。

根据我的理解,我收到此错误是因为在 Guile 读取第二个库定义时 define-library 不知何故变得未定义。 Guile 不再知道 define-library 是什么意思。这是 st运行ge 行为。到底是怎么回事?如何在 REPL 中定义两个 R7RS 库?

诡计版本:3.0.1

如果你只想在 repl 中定义它们,你可以通过将当前模块设置为 (guile-user) 来实现。就像您猜到的那样,在第一个 define-library 之后,编译器处于 (guile-user) 中默认可用的符号不可用的状态。

因此,如果您在定义两个库之间执行 ,m (guile-user) 就没问题。

scheme@(guile-user)> (define-library (example one)
  (import (scheme base))
  (export f)
  (begin
    (define (f x)
      (+ x 1))))
scheme@(example one)> ,m (guile-user)
scheme@(guile-user)> (define-library (example two)
  (import (scheme base))
  (export g)
  (begin
    (define (g x)
      (* x 2))))
scheme@(example two)> ,m (guile-user)
scheme@(guile-user)> (use-modules (example one) (example two))
scheme@(guile-user)> (f 12)
 = 13
scheme@(guile-user)> (g 9)
 = 18
scheme@(guile-user)>

我不确定如何从单个文件中让它工作(每个文件的 lib 工作正常)。我试图在第一个库之后将当前模块设置为 (guile-user)eval-when,但即使是符号 eval-when 也不可用。一定是一个错误。