Nim语言的模块化编程
前言
Nim支持把一大段程序分成若干个模块
一个模块就是一个源代码文件
每个模块都拥有它自己的名称空间
模块化可以起到封装(信息隐藏)和分步编译的作用
一个模块可以通过import语句获得另一个模块的符号
nim语言允许模块间的循环引用,
只有用星号(*)标记的顶级符号才会被导出给其他模块。
模块名和文件名相同,模块名的命名方式和nim编程语言的标识符命名方式相同
编译器编译模块的规则如下:
按照import的导入顺序,编译模块
如果存在循环引用,那么就只导入顶级符号(已解析的符号),如果编译器发现未知的标识符,那么就停止编译
请看下面的例子:
模块A的代码:
# Module A
type
T1* = int # Module A exports the type ``T1``
import B # the compiler starts parsing B proc main() =
var i = p(3) # works because B has been parsed completely here main()
模块B的代码:
# Module B
import A # A is not parsed here! Only the already known symbols
# of A are imported. proc p*(x: A.T1): A.T1 =
# this works because the compiler has already
# added T1 to A's interface symbol table
result = x + 1
看起来是不是很厉害呢?!
import语句
可以通过import导入一个或多个模块
(导入多个模块的话,只要在import后面跟上模块的名字即可,模块的名字用逗号隔开)
可以用except排除一个或多个模块中的符号
请看下面的示例代码:
import strutils except `%`, toUpper # doesn't work then:
echo "$1" % "abc".toUpper
注意:如果导入的模块中并没有导出排除的标识符的话,nim编译器是不会给出报警或异常的
include语句
include语句完全不同于import语句,
include语句会迫使编译器把一个文件的源码“包含”到另一个文件中。
需要把一个文件拆分成多个文件的时候include语句很有用
include fileA, fileB, fileC
import语句中的模块名
import语句中的模块名可以设置别名
import strutils as su, sequtils as qu echo su.format("$1", "lalelu")
如果你用了别名的话,那么原来的模块名称就不起作用了
如果一个模块在某个子目录中
可以使用如下三种办法来导入该模块
import lib.pure.strutils, lib/pure/os, "lib/pure/times"
注意:虽然模块在子目录中,但是模块名并不包含路径
下面的代码是错误的:
import lib.pure.strutils
echo lib.pure.strutils
下面这种代码设置也没有任何意义
import lib.pure.strutils as strutils
from...import...语句
如果你只想导入某一个模块的指定符号,那么你就可以使用这种语句
来看下面的代码:
from strutils import `%` echo "$1" % "abc"
# 但开发人员还是可以用完全限定符调用这个模块的其他方法:
echo strutils.replace("abc", "a", "z")
如果你想迫使开发人员必须在主调模块中使用完全限定符来调用被调模块的符号
那么你可以使用,下面这种方法
rom strutils import nil
Export语句
下来看下面三个模块的代码
# module B
type MyObject* = object
# module A
import B
export B.MyObject proc `$`*(x: MyObject): string = "my object"
# module C
import A # B.MyObject has been imported implicitly here:
var x: MyObject
echo($x)
模块A把模块B中的符号导出出来了
这样模块C就不用再导入模块B了
Nim语言的模块化编程的更多相关文章
- 嵌入式C语言之---模块化编程
当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干.你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程.比如你可能只是负责通讯或者显示这一块.这个时候,你就应 ...
- Javascript模块化编程之难处
接着上一篇“Javascript模块化编程之Why”说起,Javascript担子重了之后程序也就复杂了.在大把语言都模块化编程的形势下,Javascript也不可能袖手旁观啊,毕竟这是一条经过实践检 ...
- 单片机 C 语言模块化编程
好的开始是成功的一半 通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了.希望能够继续坚持下去.一个良好的开始是成功的一半.我们今天所做的一切都是为了在单片机编程上做的更好. 在谈论今天的主题 ...
- 【C语言探索之旅】 第二部分第一课:模块化编程
内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...
- c语言模块化编程
C语言模块化编程(封装) 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明.模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函 ...
- keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...
- Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
- Javascript模块化编程(二):AMD规范
Javascript模块化编程(二):AMD规范 作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_d ...
- Javascript模块化编程(二):AMD规范(转)
这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...
随机推荐
- Daily Scrum 12.16
今日完成任务: 完善了资源界面的UI设计:解决了PDF显示相同的问题:解决了下载时有时找不到文件的问题,因为上届建了upload和resource两个文件夹存文件,写代码时候写乱套了. 明日任务: 黎 ...
- HBase安装及简单使用
通过之前的hadoop0.20.2的安装并调试成功,接下来我们继续安装hbase0.90.5.在安装hbase0.90.5之前,因为hbase0.90.5只支持jdk1.6,所以,我把之前的jdk1. ...
- CSS布局技巧 -- sticky属性
在一些很长的表格中,往往需要使用表头悬浮的设计以方便用户使用,例如H5电商页面通过下滑展示大量商品列表时,顶部的导航栏需要在离开屏幕时,需要固定在屏幕顶部以方便用户筛选类别.这种效果一直以来需要通过J ...
- Maven插件之maven-archetype-plugin
Maven插件之maven-archetype-plugin 时间:2014-03-29 学过Maven的人,都知道用MyEclipse的Maven插件生成一个项目骨架,比如maven-archety ...
- C语言的选择和循环上机题目(部分)
/*(1)某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元/公里,3公里以外2.1元/公里:富康8元/公里,3公里以外2.4元/公里:桑塔纳9元,3公里以外2.7元/公里.编程:从键盘输入乘车 ...
- Java LinkedList 源码剖析
LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack).这样看来,LinkedList简直就 ...
- windows里面的批处理命令不停地处理同一条命令
最近在设置路由表的时候,为了方便,做了一个批处理 route.bat route delete 0.0.0.0route delete 10.25.0.0route ADD 10.25.0.0 MAS ...
- 如何使用BHO定制你的Internet Explorer浏览器
原文出处:Browser Helper Objects: The Browser the Way You Want It一.简介 有时,你可能需要一个定制版本的浏览器.在这种情况下,你可以自由地把一些 ...
- list-style
list-style: inside url(" "); 默认li的点在父级div框的外面,在li上加样式list-style-position: inside;可以使点在框内:点 ...
- Ms - Sql 定位附近的人
数据库结构: T_Users longitude decimal(6,0) latitude decimal(6,0) 经纬度:113.284137,23.184625 查出周围2公里以内的人: se ...