我有这两个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是什么意思。这是一种奇怪的行为。怎么一回事?如何在REPL中定义两个R7RS库?
Guile版本: 3.0.1
发布于 2021-09-25 05:52:36
如果只想在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行得很好)。我试图在第一个库之后用eval-when将当前模块设置为(guile-user),但即使是符号eval-when也不可用。一定是个窃听器。
https://stackoverflow.com/questions/69311991
复制相似问题