Chicken方案:加载或编译时缺少警告/错误消息



我一直在玩鸡计划很短的时间,但我注意到一些不寻常的东西。假设我有以下简单的源文件:

(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 -函数被优化掉),我仍然没有得到任何类型的错误消息或警告。

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

我错过了什么?我该怎么修理它?可以它是固定的,还是我必须手动load每一个涉及的文件手动在csi实际编译任何程序之前有一些信心?

这不会给出错误消息的原因是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将整个代码隐式地包装在一个(无名的)模块中。

相关内容

  • 没有找到相关文章

最新更新