程序
Scheme程序由一系列表达式,定义和语法定义组成。
出现在程序最高层的定义和语法定义可被解释为声明,它们是在最高层环境创建绑定,或者改变已有的最高层绑定的值。
出现在程序最高层的表达式被解释为命令,当程序被调用或被加载时,它们按顺序执行,通常会完成某些初始化的工作。
定义
定义只能出现在程序
<program>
的最高层或<body>
的开头。
定义的格式:
1. (define <variable> <expression>)
2. (define (<variable> <formals>) <body>)
等价于:
(define <variable>
(lambda (<formals>) <body>))
3. (define (<variable> . <formal>) <body>)
※<formal>应为一个单独的变量
等价于:
(define <variable>
(lambda <formal> <body>))
最高层定义
在程序的最高层,如果变量<variable>
已绑定,定义
(define <variable> <expression>)
的作用在本质上与下面的赋值表达式相同:
(set! <variable> <expression>)
但如果<variable>
未被绑定,定义就会在执行赋值之前将<variable>
绑定到一个新的存储位置。反之,在一个未被绑定的变量上执行set!是一个错误。
内部定义
定义可以出现在<body>
的开头,即内部定义。它们的作用域是整个<body>
。
例:
(let ((x 5)) '第二行开始为<body>部
(define foo (lambda (y) (bar x y))) '内部定义
(define bar (lambda (a b) (+ (* a b) a))) '内部定义
(foo (+ x 3))) => 45
包含内部定义的<body>
总可以被转换为完全定价的letrec表达式。
例:
(let ((x 5))
(letrec ((foo (lambda (y) (bar x y)))
(bar (lambda (a b) (+ (* a b) a))))
(foo (+ x 3))))
语法定义
语法定义只能出现在程序
<program>
的最高层。
定义的格式:
(define-syntax <keyword> <transformer spec>)