Chicken Scheme:加载或编译时缺少 warnings/error 消息
Chicken Scheme: Missing warnings/error messages when loading or compiling
我在 Chicken Scheme 中玩了一段时间,但我发现了一些不寻常的地方。假设我有以下简单的源文件:
(define (f x)
(g x))
很明显(对人类来说)这是行不通的。当我启动 csi
并手动输入此函数定义时,我收到以下消息:
Note: the following toplevel variables are referenced but unbound:
g (in f)
很高兴知道!在你 运行 之前发现大型程序中的拼写错误是件好事。现在,让我们再次启动 csi
并尝试 load
文件:
(load "test.scm")
输出:
; loading test.scm ...
Note: the following toplevel variables are referenced but unbound:
g (in f)
还不错。现在,让我们尝试使用该文件启动 csi
!
$ csi test.scm
CHICKEN
(c) 2008-2015, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.10.0 (rev b259631)
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
compiled 2015-08-04 on yves.more-magic.net (Linux)
; loading test.scm ...
#;1>
呃...错误信息去哪了?为什么它不在那里?好吧,也许当我真正尝试编译它时它会抱怨...
$ csc test.scm
$
没有。即使我将行 (f 2)
添加到文件末尾(以避免 f
-函数被优化掉)我仍然没有得到 any 排序错误消息或警告。
为什么?解释器(或者至少是手册 load
的一部分)怎么能立即注意到这个问题而编译器却不能呢?有趣的是,编译器有一个 -no-warnings
参数。正如预期的那样,它什么都不做,因为没有警告。
我错过了什么?我该如何解决? 能否修复它,或者我是否必须在 csi
中手动 load
每个涉及的文件,然后再自信地实际编译任何程序?
之所以不报错是因为CHICKEN支持单独编译。这就像在 C 中一样工作:您可以单独编译文件,然后 link 将它们组合在一起形成可执行文件。此外,可以通过 eval
在代码 运行 中(重新)定义一个变量,这意味着编译器不能对此做出太多假设(默认情况下)。
如果你想得到一个错误,我建议你模块。这些应该是完整的 "closed worlds",因此如果未引用标识符,则会产生错误:
$ cat foo.scm
(module foo (f)
(import chicken scheme)
(define (f x)
(g x))
)
$ csc foo.scm
Warning: reference to possibly unbound identifier `g' in:
Warning: main#f
Error: module unresolved: main
Error: shell command terminated with non-zero exit status 256: csc foo.scm
为方便起见,您还可以使用 csc -M
将整个代码隐式包装在(无名)模块中。
我在 Chicken Scheme 中玩了一段时间,但我发现了一些不寻常的地方。假设我有以下简单的源文件:
(define (f x)
(g x))
很明显(对人类来说)这是行不通的。当我启动 csi
并手动输入此函数定义时,我收到以下消息:
Note: the following toplevel variables are referenced but unbound:
g (in f)
很高兴知道!在你 运行 之前发现大型程序中的拼写错误是件好事。现在,让我们再次启动 csi
并尝试 load
文件:
(load "test.scm")
输出:
; loading test.scm ...
Note: the following toplevel variables are referenced but unbound:
g (in f)
还不错。现在,让我们尝试使用该文件启动 csi
!
$ csi test.scm
CHICKEN
(c) 2008-2015, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.10.0 (rev b259631)
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
compiled 2015-08-04 on yves.more-magic.net (Linux)
; loading test.scm ...
#;1>
呃...错误信息去哪了?为什么它不在那里?好吧,也许当我真正尝试编译它时它会抱怨...
$ csc test.scm
$
没有。即使我将行 (f 2)
添加到文件末尾(以避免 f
-函数被优化掉)我仍然没有得到 any 排序错误消息或警告。
为什么?解释器(或者至少是手册 load
的一部分)怎么能立即注意到这个问题而编译器却不能呢?有趣的是,编译器有一个 -no-warnings
参数。正如预期的那样,它什么都不做,因为没有警告。
我错过了什么?我该如何解决? 能否修复它,或者我是否必须在 csi
中手动 load
每个涉及的文件,然后再自信地实际编译任何程序?
之所以不报错是因为CHICKEN支持单独编译。这就像在 C 中一样工作:您可以单独编译文件,然后 link 将它们组合在一起形成可执行文件。此外,可以通过 eval
在代码 运行 中(重新)定义一个变量,这意味着编译器不能对此做出太多假设(默认情况下)。
如果你想得到一个错误,我建议你模块。这些应该是完整的 "closed worlds",因此如果未引用标识符,则会产生错误:
$ cat foo.scm
(module foo (f)
(import chicken scheme)
(define (f x)
(g x))
)
$ csc foo.scm
Warning: reference to possibly unbound identifier `g' in:
Warning: main#f
Error: module unresolved: main
Error: shell command terminated with non-zero exit status 256: csc foo.scm
为方便起见,您还可以使用 csc -M
将整个代码隐式包装在(无名)模块中。