Nim教程【二】

简介: 第一篇教程1秒内就被管理员从首页踢掉了 管理员嫌内容太少,没有含金量,这次多写一些。 这应该是国内第一个关于Nim入门的系列教程 好,闲话休提,言归正传 Nim介绍 Nim代码会编译成C语言的代码,再编译成本地...
第一篇教程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噬菌体 张逸   
目录
相关文章
|
7月前
【力扣】292. Nim 游戏
【力扣】292. Nim 游戏
|
7月前
|
C++
Nim 游戏(C++)
Nim 游戏(C++)
72 0
|
人工智能 决策智能
Nim游戏——简单博弈论
Nim游戏——简单博弈论
124 0
Nim游戏——简单博弈论
|
机器学习/深度学习
LightOJ1186——Incredible Chess(nim游戏)
LightOJ1186——Incredible Chess(nim游戏)
62 0
|
决策智能
LeetCode之Nim Game
LeetCode之Nim Game
123 0
|
索引
Nim教程【十】
openarray类型 注意:openarray类型只能用于参数 固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便 对于一个方法来说,传入参数如果是一个数组,最好是不要限制数组的长度 也就是说,方法应该能够处理不同大小的数组 openarray类型就是为了满足这样的要求而设计...
1117 0
|
索引
Nim教程【九】
向关注这个系列的朋友们,道一声:久违了! 它并没有被我阉掉,他一定会得善终的,请各位不要灰心 Set集合类型 为了在特殊场景下提高程序的性能设置了Set类型,同时也是为了保证性能,所以Set只能容纳有序类型, Set类型可以被一个大括号实例化: var x = {},x就是一个空的set类型 还...
922 0
|
编译器 容器
Nim教程【十四】
网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在system模块中定义了异常类型的基类 所有的异常都应该派生自system.
1037 0