8. 顶层程序
一个顶层程序为定义和运行一个Scheme程序制定一个入口点。一个顶层程序指定导入库和准备运行的程序的一个集合。通过被导入的库,不管是直接地还是通过导入的传递闭包(transitive closure),一个顶层程序定义了一个完整的Scheme程序。
8.1. 顶层程序语法
顶层程序是带分隔符的文本片段,通常是一个文件,其有如下的形式:
<import form> <top-level body>
一个<import form>有如下的形式:
(import <import spec> ...)
一个<top-level body>有如下的形式:
<top-level body form> ...
一个<top-level body form>或者是一个<definition>或者是一个<expression>。
<import form>和库中的导入子句是相同的(见7.1小节),且指定要导入的库的一个集合。一个<top-level body>就像一个<library body>(见7.1小节)一样,除了定义和表达式可以以任何次序出现。因此,<top-level body form>指定的语法引用了宏扩展的结果。
当使用来自(rnrs base (6))库的begin, let-syntax, 或letrec-syntax的时候,如果其先于第一个表达式出现在顶层程序的内部时,那么它们被拼接到内部中;见11.4.7小节。内部的一些或所有,包括begin, let-syntax, 或letrec-syntax里面的部分,可以通过一个句法抽象指定(见9.2小节)。
8.2. 顶层程序语义
一个顶层程序被执行的时候,程序就像一个库一样被对待,执行其定义和表达式。一个顶层内部的语义可以通过一个简单的转换将其转换到库内部来解释:在顶层内部中每一个出现在定义前的<expression>被转换为一个哑(dummy)定义
(define <variable> (begin <expression> <unspecified>))
其中,<variable>是一个新鲜的标识符,<unspecified>是一个返回未定义值得无副作用的表达式。(如果不同时对内部进行扩展,那么,判断哪个形式是定义,哪个形式是表达式通常是不可能的,因此,实际的转换多少会更加复杂;见第10章。)
在支持它的平台上,一个顶层程序可以通过调用command-line过程(见库的第10章)访问它的命令行。