6.2模块语法

#lang在模块文件的开始处是一种module形式的简写。就像'是quote的简写。但是#lang不能在repl里使用,一部分原因是它必须使用文件end-of-file接受,也因为简写表达是#lang依赖闭合的文件。

6.2.1module 形式

module定义,在repl和文件里都有效

  (module name-id initial-module-path
    decl ...)

name-id是模块名,initial-module-path是默认导入,而且每一个decl都市一个导入,导出,定义,或者表达式。当在文件里的时候,name-id一般和包含它的文件同名,但是不包括路径或者文件后缀。当通过文件路径引用模块时,name-id会被忽略。
initial-module-path是必要的,因为即使是require形式也必须导入才能使用。换句话说,initial-modult-path导入了方法体里的可用语法。最常用的模块是racket,它提供了包括require,define,provide和文档里的大多数绑定。另外一个常用模块时racket/base,也提供了大多数需要的函数和语法。
在repl里面可以用模块语法直接定义一个模块,而且只要使用模块名就可以引用该模块。
定义一个模块不会马上致谢模块的第一个和表达式。当模块被引用的时候将触发执行。但是它只会在第一次引用时(require),才会执行。

6.2.2#lang简写

lang简写没有特别的语法,因为语法被#lang的语句定义。比如这样:

  #lang racket 
    decl ...

它和下面等价

  (module name racket
    decl...)

上面形式的方法名可以通过文件名来推断。
6.2.3子模块
模块能内嵌在模块里面,内嵌的模块定义了一个子模块。子模块在模块里面可以用名字直接引用。
运行一个模块不会直接运行子模块,它们会独立运行。
子模块也可以内嵌子模块。其它模块可以通过子模块路径来引用自模块。

  (module* name-id inital-module-path-or-#f
    decl ...)

它和module不同的地方在于

  • module无法访问包含它的模块的绑定和环境。

  • module可以访问包含它的模块的绑定,通过require,但是包含环境无法导入子模块。
    此外,module
    形式可以定义#f代替initial-modult-path,那么子模块可以使用封闭环境的任何东西,包括没通过provide导出的。
    一个应用module* #f的应用是在模块里默认不导出子模块,除非你指定导出子模块。代码类似于

    (require (submod "rake.rkt" extras))
    

6.2.4主要和测试子模块
运行一个模块并不会运行内部的module*定义的子模块。但是命名为main的子模块会运行。如果main模块不需要使用闭包模块,它可以使用module定义。或者使用module+

  (module+ name-id
    decl ...)

一个使用module+的模块就像使用module*,并且用#f来作为initial-module-path参数。而且,module+的name-id可以一样,所有同名的module+方法体联合起来构建一个子模块。这种合并行为特别适合用来构建测试。只要在命令行里欲行 raco test ...就可以运行其中的测试。否则加载模块不会欲行测试代码。
使用module+可以使代码分布在不同的地方。而且使用module+更具有可读性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 模块 Node 有简单的模块加载系统。在 Node 里,文件和模块是一一对应的。下面例子里,foo.js加载同一个...
    保川阅读 594评论 0 0
  • 每天都一头扎入工作的大海中 忙忙碌碌,头昏脑胀 却在一天结束后 不知道收获了什么 你是否也有这种感觉? 然而,何解...
    也许爱上他阅读 287评论 0 1
  • 当树们的鹅黄眉眼舒展的时候,芦苇也醒了。其实它早就按捺不住一冬的寂寞,争先恐后地从沟脚边探出脑袋,细细的,尖...
    舒小君阅读 303评论 2 0
  • 读完罗胖的《我懂你的知识焦虑》,不但重新整顿了我的三观,并且还找到了我心心念念的要找的书,此时特别应景的想插入一句...
    雲朵兒阅读 443评论 0 1