Chicken Scheme:加载或编译

时间:2016-06-30 17:33:08

标签: compiler-errors chicken-scheme

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

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

我错过了什么?我该如何解决? 可以修复它还是我必须手动loadcsi中手动$scope.openLargeGraph = function () { var childWindow = window.open('graphs.html', "", "width=950,height=850"); if(childWindow) //in case the new window blocked by browser childWindow.postMessage($scope.data, '*'); }; 每个涉及的文件,然后才真正有信心地编译任何程序?

1 个答案:

答案 0 :(得分: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隐式将整个代码包装在(无名)模块中。