第一篇教程1秒内就被管理员从首页踢掉了
管理员嫌内容太少,没有含金量,这次多写一些。
这应该是国内第一个关于Nim入门的系列教程
好,闲话休提,言归正传

Nim介绍
Nim代码会编译成C语言的代码,再编译成本地机器码,不依赖于虚拟机,
而且生成的可执行文件比较小,不依赖于其他库,分发起来比较方便

拥有一个“非追踪式”的垃圾收集器,这就非常适用于类似游戏这样的“弱实时”系统

让程序员拥有直接操纵内存和访问硬件的权力(手动管理的内存有别于垃圾收集器可收集的内存)

零开销的迭代器

Cross-module inlining(这是跨模块代码嵌入吗?不知道怎么翻)

实现了动态方法绑定,但并没有用到虚拟方法表
(virtual method table,这是在黑.NET吧)

编译期评估用户自定义的方法

无用代码自动消除

直接在栈上为实例、对象、数组分配空间

类型推断

在上一篇教程中,我们的helow world程序中有这么一行代码
var name: string = readLine(stdin)

这行代码定义了一个string类型的变量,从控制台输入获取字符串,赋值给这个变量

还可以写成这样
var name = readLine(stdin)

因为,在编译的时候nim知道控制台输入的东西是一个字符串类型的值,所以变量的类型也一定是字符串类型的

开发人员就不必特意指定这个变量的类型了

这就是Nim的类型推断,可以提升开发效率,节省很多开发量哦

转义字符

在Nim中,与C语言类似,反斜杠(\)是它的转移符号,比方说\n代表换行符,\t代表tab制表符,
如果你不想在你的字符串中大量使用转移字符,比方说,类似路径字符串:C:\program files\nim
你可以写成这样:
var path = r"C:\program files\nim"

这就是传说中的“原始字串”,在原始字串中,反斜杠不会被当作转义符


大段文本

 

在开发程序的时候,往往需要写大段文本,比如HTML的模版

Nim允许开发人员用成对儿的三个分号包住大段文本,文本里的反斜杠也不会被当作转义符

就像这样:
var str = """这是我的大段文本
我换了一行
我又换了一行
就算有反斜杠,\,也不会被当作转义符"""

注释


在新的一行上写注释,用一个#号开头就好,代码如下:
#这是一行注释
var name = readLine(stdin)

在现有代码后面写注释,要用两个##号,代码如下:

var name = readLine(stdin)  
##这是行尾注释

关键字var


var可以定义局部或者全局变量
var x,y:int 

上面的代码定义了两个整形的变量


我们还可以用换行的方式,定义一系列的变量
var 
    x , y : int
    i , z :  string

如果要在声明的时候就赋值
那么可以写成这样的形式
var x , y = 3

关键字const


先来看一下示例代码:
const x = 4
const关键字和var关键字类似,也可以换行批量定义
const 
    x = 4
    y = x+5
    z = "allen"

需要注意的是:

1、const定义的变量不能被修改
2、因为编译器会把所有const变量换成他所对应的值,所以变量对应的值是表达式的话,在编译器一定要能对表达式求值才行

关键字let


用let定义的变量,赋值后也不能被修改,但用let定义的变量,可以在运行期赋值
const input = readLine(stdin) # Error: 运行期的值不能赋给const变量
let input = readLine(stdin)   # works:运行期的值可以赋给let定义的变量

关键字 if  elif和else


一定要注意,是elif,而不是elseif;(少写一个字母是一个啊)
let name = readLine(stdin)
if name == "":
  echo("Poor soul, you lost your name?")
elif name == "name":
  echo("Very funny, your name is name.")
else:
  echo("Hi, ", name, "!")

关键字 case of和esle


注意,不是switch和case;而是case和of;
(少写一个字母是一个啊)
let name = readLine(stdin)
case name
of "":
  echo("Poor soul, you lost your name?")
of "name":
  echo("Very funny, your name is name.")
of "Dave", "Frank":
  echo("Cool name!")
else:
  echo("Hi, ", name, "!")

我们再来看一段代码

from strutils import parseInt
 
echo("A number please: ")
let n = parseInt(readLine(stdin))
case n
of 0..2, 4..7: echo("The number is in the set: {0, 1, 2, 4, 5, 6, 7}")
of 3, 8: echo("The number is 3 or 8")
else: discard

如果什么条件都没有满足,那么就会进入else分支

这里的discard,就是说什么也不做

关键词 while


echo("What's your name? ")
var name = readLine(stdin)
while name == "":
  echo("Please tell me your name: ")
  name = readLine(stdin)

一定要注意最后一行的缩进,如果没有这个缩进,会出问题,我们后面会讲到


关键词for和..


countup是一个方法,这个方法每次返回一个整形值,在下面这段代码中,就返回1到10的值
echo("Counting to ten: ")
for i in countup(1, 10):
  echo($i)
一定要注意最后面那个冒号
如果你打算让他返回从10到1,那么你应该使用countdown(10, 1)

nim语言还提供了..关键字来简化这种写法
(少写一个字母是一个啊)
echo("Counting to ten: ")
for i in 1..10:
  echo($i)

最后推荐几个老园友的博客给大家
老赵

T2噬菌体

张逸
  

Nim教程【二】的更多相关文章

  1. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  3. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  4. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  5. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  6. 无废话ExtJs 入门教程二[Hello World]

    无废话ExtJs 入门教程二[Hello World] extjs技术交流,欢迎加群(201926085) 我们在学校里学习任何一门语言都是从"Hello World"开始,这里我 ...

  7. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  8. Laravel教程 二:路由,视图,控制器工作流程

    Laravel教程 二:路由,视图,控制器工作流程 此文章为原创文章,未经同意,禁止转载. View Controller 上一篇教程我们走了那么长的路,终于把Laravel安装好了,这一篇教程我们就 ...

  9. Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

      分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloade ...

  10. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

随机推荐

  1. (转)UVM内容梗概

    1. 类: 面向对象基础传统的面向对象编程与systemverilog类的特点,类的定义,成员与方法,构造函数,对象的复制和深/浅拷贝,父类/子类关系,类的继承,作用域的规则,对象的句柄以及赋值,方法 ...

  2. Autofac 的构造函数注入方式

    介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数. 在编写 aufofac 的依赖注入 ...

  3. VC++ 中简单操作MP3音乐的方法,小结

    #include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <shellap ...

  4. Java NIO教程 Selector

    这次我们开讲非阻塞I/O中的Selector,它需要配合非阻塞的TCP和UDP来使用.首先我们先简单讲一下TCP和UDP的非阻塞通道. 非阻塞I/O通道 在上代码前我们先讲解一些最基本的知识.TCP和 ...

  5. Servlet 利用Session实现不重复登录

    import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.It ...

  6. System.IO中的File、FileInfo、Directory与DirectoryInfo类(实例讲解)

    一.建立的文件夹(对这些文件进行以上四个类的操作): 父目录: 父目录的子目录以及父目录下的文件: 子目录下的文件: 二.效果图 三.代码实现 using System; using System.I ...

  7. Selenium2+python自动化21-TXT数据参数化

    前言      在17篇我们讲了excel数据的参数化,有人问了txt数据的参数化该怎么办呢,下面小编为你带你txt数据参数化的讲解 一.以百度搜索为例,自动搜索五次不同的关键字.输入的数据不同从而引 ...

  8. JSON.parse()和JSON.stringify()(转载)

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...

  9. AT91-PWM应用

    步骤1: make menuconfig配置内核, 开启PWM输出功能. Device Drivers ---> Misc devices  ---> <*>Atmel AT3 ...

  10. Java—继承、封装、抽象、多态

    类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...