2016-06-30 28 views
1

我一直在鸡计划玩了一会儿,但我注意到一些不寻常的东西。假设我有以下简单源文件:鸡计划:加载或编译时缺少警告/错误消息

(define (f x) 
    (g x)) 

很明显(对于人类bean),这是行不通的。当我启动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功能被优化掉),我仍然没有得到任何类型的错误消息或警告。

为什么?解释器(或至少手册load的一部分)如何立即注意到这个问题,但编译器不能?有趣的是,编译器有一个参数-no-warnings。正如预期的那样,由于没有警告,它什么都不做。

我错过了什么?我该如何解决它? 可以它是固定的还是我将不得不手动load手动load手动csi在实际编译任何程序之前有一些自信?

回答

2

这不会给出错误信息的原因是CHICKEN支持单独编译。这可以像C中一样工作:可以分别编译文件,然后将它们链接在一起形成可执行文件。另外,可以通过eval(重新)定义代码中的变量,这意味着编译器无法对此做出太多假设(默认情况下)。

如果你想得到一个错误,我会建议你模块。这些应该是完全“封闭的世界”,因此,如果一个标识符是未引用的,它会产生一个错误:

$ 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隐含地包住整个代码在(无名)模块,用于方便。

+0

谢谢你,工作! – cronotk