DrRacket分为上下两块,上面的称为definitions area,下面的称为interactions area。
racket语言支持两种等价方式定义模块,#lang
和module
。
#lang racket
或(module module1 racket …
,表示将racket模块中的所有绑定都导入当前模块。
这些初始化绑定决定了哪些符号在模块中是可用的,称为module language。
1. 用#lang,导入模块
(1)1.rkt
#lang racket
(provide add1)
(define (add1 x)
(+ x 1))
(2)定义区
#lang racket
(require (file "C:/Users/thzt/Desktop/test/1.rkt"))
(3)交互区
> (add1 2)
3
2. 用module导入模块
(1)1.rkt
(module module1 racket
(provide add1)
(define (add1 x)
(+ x 1)))
(2)定义区
(module module2 racket
(require (file "C:/Users/thzt/Desktop/test/1.rkt")))
(3)交互区
> (add1 2)
3
3. 定义lambda演算模块
(1)1.rkt
(module lambda-calculus racket
(provide (rename-out [1-arg-lambda lambda]
[1-arg-app #%app]
[1-form-module-begin #%module-begin]
[no-literals #%datum]
[unbound-as-quoted #%top]))
(define-syntax-rule (1-arg-lambda (x) expr)
(lambda (x) expr))
(define-syntax-rule (1-arg-app e1 e2)
(#%app e1 e2))
(define-syntax-rule (1-form-module-begin e)
(#%module-begin e))
(define-syntax (no-literals stx)
(raise-syntax-error #f "no" stx))
(define-syntax-rule (unbound-as-quoted . id)
'id))
(2)定义区
#lang racket
(require (file "C:/Users/thzt/Desktop/test/1.rkt"))
(3)交互区
> ((lambda (x) (x z))
(lambda (y) y))
'z
注:
(1)模块可以使用provide
,all-from-out
,except-out
,rename-out
来控制模块的输出。
(2)#%app
,#%module-begin
,#%datum
,#%top
是racket模块隐含提供的。
#%module-begin
在定义模块时,会在模块主体上隐含调用。
(必须被导出,否则使用该模块的模块将不能成为一个合法的module了。)
#%app
隐含用于函数调用。
#%datum
用于字面量。
#%top
用于那些没有绑定的标识符。
(3)上面的例子通过重命名这些隐含绑定,定义了lambda-calculus模块。