美文网首页
6.2模块语法

6.2模块语法

作者: jarod_chan | 来源:发表于2015-12-08 19:34 被阅读36次

#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+更具有可读性。

相关文章

  • 6.2模块语法

    #lang在模块文件的开始处是一种module形式的简写。就像'是quote的简写。但是#lang不能在repl里...

  • 第6章 数据的基本操作

    6.1 插入数据 语法: 示例: 6.2 删除数据 语法: 示例: 说明:对于删除条件(WHERE),应根据实际业...

  • 前端JS进阶一(ES6-模块化)

    模块化语法 export语法 import语法 模块化-babel Babel 通过语法转换来支持最新版本的 Ja...

  • Python import语句导入模块语法

    Python import语句导入模块语法 源文档Python import语句导入模块语法python中的imp...

  • es6的模块系统

    js引擎运行模块时: 语法解析: 阅读模块源代码,检查语法错误; 加载: 递归的加载所有被导入的模块(深度优先遍历...

  • node03-hackerNews2.0和模块化的使用

    url模块和querystring模块 url模块:能够解析req.url的模块 url.parse语法: ​ ...

  • 6.表和数据的管理

    6.1 创建表 6.2 表删除 语法:DROP TABLE 表名 6.3 表的修改 6.4 数据的增删改 6.4...

  • 模块

    调用模块语法:import 模块from 模块 import 方法 1.random 模块(1)产生指定范围内的随...

  • lua脚本语法

    开发工具 vscode 插件 语法 模块

  • python使用as给函数指定别名

    通用语法: 还可以给模块指定别名: 导入模块的所有函数:

网友评论

      本文标题:6.2模块语法

      本文链接:https://www.haomeiwen.com/subject/llashttx.html