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模塊。