1

我有这两个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,但我得到完全相同的错误。

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

Guile 版本:3.0.1

4

1 回答 1

0

如果您只想在 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)
$1 = 13
scheme@(guile-user)> (g 9)
$2 = 18
scheme@(guile-user)>

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

于 2021-09-25T05:52:36.017 回答