-
Notifications
You must be signed in to change notification settings - Fork 21
/
06.2.3 子模块
55 lines (33 loc) · 2.34 KB
/
06.2.3 子模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
6.2.3 子模块
一个module表可以被嵌套在一个模块内,在这种情况下,这个嵌套module表声明一个子模块。子模块可以通过外围模块使用一个引用名称直接引用。下面的例子通过从zoo子模块导入tiger打印“Tony”:
"park.rkt"
#lang racket
(module zoo racket
(provide tiger)
(define tiger "Tony"))
(require 'zoo)
tiger
运行一个模块不是必须运行子模块。在上面的例子中,运行“park.rkt”运行它的子模块zoo仅因为“park.rkt”模块require了这个zoo子模块。否则,一个模块及其子模块可以独立运行。此外,如果“park.rkt“被编译成字节码文件(通过raco make),那么“park.rkt”代码或zoo代码可以独立下载。
子模块可以嵌套子模块,而且子模块可以被一个模块通过使用子模块路径直接引用,不同于它的外围模块。
一个module*表类似于一个嵌套的module表:
(module* name-id initial-module-path-or-#f
decl ...)
module*表不同于module,它反转这个对于子模块和外围模块的参考的可能性:
1、用module申明的一个子模块模块可通过其外围模块require,但子模块不能require外围模块或在词法上参考外围模块的绑定。
2、用module*申明的一个子模块可以require其外围模块,但外围模块不能require子模块。
此外,一个module*表可以在initial-module-path的位置指定#f,在这种情况下,所有外围模块的绑定对子模块可见——包括没有使用provide输出的绑定。
用module*和#f申明的子模块的一个应用是通过子模块输出附加绑定,那不是通常的从模块输出:
"cake.rkt"
#lang racket
(provide print-cake)
(define (print-cake n)
(show " ~a " n #\.)
(show " .-~a-. " n #\|)
(show " | ~a | " n #\space)
(show "---~a---" n #\-))
(define (show fmt n ch)
(printf fmt (make-string n ch))
(newline))
(module* extras #f
(provide show))
在这个修订的“cake.rkt”模块,show不是被一个模块输入,它采用(require "cake.rkt"),因为大部分“cake.rkt“的用户不想要那些额外的函数。一个模块可以要求extra子模块使用(require (submod "cake.rkt" extras))访问另外的隐藏的show函数。