6.1模块基础

每个Racket模块都存在自己的文件。

  #lang racket
  (provide print-cake)
  ;draws a cake with n candles
  (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))

其它模块可以引入cake.rkt来使用print-cake函数,因为provid行明确导出了print-cake函数。而show函数时私有,因为它没有导出。

  #lang racket
  (require "cake.rkt")
  (print-cake (random 30))

"cake.rkt"通过require导入相同目录的文件。unix风格的相对目录在所以平台上用来作为相对模块引用。

6.1.1组织模块

上面代码的列子展示了最通用模块代码组织方式:把所有的文件放在一个目录或者子目录里,然后通过相对路径来引用。模块的目录能被当成一个项目,因为它能整个在系统文件里移动或者拷贝到其它机器上,相对路径保存了彼此之间的模块连接。
racket工具都会自动使用相对路径来工作。比如
 racket sort.rkt
在命令行运行上述命令会自动加载编译相关模块。如果程序足够大,从源代码编译太耗时间,可以使用
 raco make sort.rkt
命令来编译"sort.rkt"和它依赖的文件到字节码文件。再运行
racket sort.rkt将会自动使用字节码文件当它们存在的时候。

6.1.2库集合

一个集合是一个层次组织的一按的库模块。集合易用通过一个没有引号和后最的路径。
当你搜索在线文档,搜索结果就表明了提供绑定的模块。当你在文档里点击一个超链接,停留在绑定名称上也可以显示提供它的模块。
一个模块的引用像racket/date看上去像一个标识符,但是它其实不会被当做标识符处理,它会转化成基于集合的引用

  • 首先,如果路径没有/,require会自动添加/main。比如require slideshow等价于require slideshow/main
  • 其次,require隐式添加".rkt"后缀
  • 最后,require通过安装的集合搜索路径,而不是把路径当成相对于封闭的模块路径
    一个集合实现像一个文件系统目录。但是这只是require查找的其中一个地方。包括用户定义目录,还有PLTCOLLECTS配置的路径,还有安装的包都是查找的范围。

6.1.3包和集合

包是安装在racket包管理器的库集合(包括已经预先安装在racket分发包里的)。比如racket/gui由gui提供,paser-tools/lex由parser-tools提供。
racket程序不直接引用包。程序通过集合引用库,添加或者移除包会改变集合库。集合可以安装不同的包,但是包管理器会保证不发生冲突。相见包管理的文档。
6.1.4添加集合
回顾上面的例子,假设db和mechine模块都需要帮助函数。帮助函数能放在util目录下,而db和mechine都能通过相对路径../utils/来引用。一个程序员可以按照相关路径来引用而不用知道你的racket配置。
一些库是给多个项目使用的,所以把这个库的源代码放在和使用它的模块一起并没有什么意义。在这种情况下,最好添加一个新的集合。当这个库被安装到集合以后,她就能用没有引号的方式引用,就像racket分发包里的库一样。
你能添加一个新的集合,只要在racket的安装目录放置文件,也可以在函数get-collects-search-dirs返回的目录。此外,你也可以设置PTLCOLLECTS变量来添加搜索目录。当然,直接添加一个包的方式是最佳选择。
创建一个包并不意味着你必须注册这个包或者执行打包步骤复制源代码到一个归档文件。创建一个包只是简单的意味着包管理器使你的包可以在本地像集合一样被访问。
举例来说,假设你有一个目录/usr/molly/bakery包含cake.rkt模块以及相关模块。为了让这个模块可以像bakery集合一样,你可以

  • 使用明令行中的raco命令
     rako pkg install --link /usr/molly/bakery
    --link参数不是必须的,当目录里有分隔符的时候,你可以省略。
  • 使用DrRacket包管理选项(在文件目录下)。执行该选项,选择目录/usr/molly/bakery,然后安装。
    在这之后,只要使用(require bakery/cake)就能引用这个模块下的函数。
    默认情况下,你安装的目录名字被当做包名和集合名来使用。淡然,包管理器安装的库也只对当前用户有效,如果想对所有人有效,可以看racket包管理章节。
    如果你打算分发你的包,请小心选择你的包名。集合的命名空间是分层的,但是顶级的集合名是全局的,而且包的命名空间是平的。可以使用像molly一样的标识符来区分作者,然后把库放在洗面。
    当你的包被安装到集合以后,你还是可以使用raco命令编译库源码,使用raco setup更好。它使用集合名病情编译集合里的所有库。此外,它还会构建集合文档到文档索引,当你在集合里指定了info.rkt。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,758评论 0 27
  • 时间再一次完成了关于年轮的使命,带着世间万物走完了这一年。 2016对我来说是经历很多的一年,步履缓慢、步履...
    1998一路向楠阅读 426评论 0 0
  • 今天知道成绩了。一直想:真的,考个51低空飞过就好了。结果考了66.5觉得很惊喜。。 考试当天,我是被乌鸦给吵醒的...
    许鹰圆阅读 3,215评论 0 4
  • 2013年11月22日星期五晚21点 仿佛是习惯了,愿意在这样的时刻去慢慢地品味岁月的味道。有些困倦,但是却醒着,...
    悦者阅读 261评论 0 4
  • 如今的我已经25了,每每一想到自己已经度过了人生的四分之一就觉得可怕,尤其是现在还是个没有另一半,没有稳定工作的刚...
    静婧_5293阅读 251评论 0 0