Nim教程【三】

简介: 这是国内第一个关于Nim的系列教程 (至少我百度和必应是没有找到类似的教程) 先说废话 有人说 Golang的编译器/工具链也学互联网行业跟风拿用户当测试,简直一点素质没有。
这是国内第一个关于Nim的系列教程
(至少我百度和必应是没有找到类似的教程)

先说废话
有人
Golang的编译器/工具链也学互联网行业跟风拿用户当测试,简直一点素质没有。
Go社区的风气不是很好,发布半成品成风。
也许有人会说因为Go社区还年轻,但是Node社区也很年轻,虽然很多库功能很弱,但是完成了的功能都是比较完备的。
我就啥也不说了,免得被炮火波及,哈哈!
(不管怎么说,我昨天跑到go社区的QQ群里去推Nim,至少是没有被踢掉的,哈哈,而且还有一个人表示对Nim感兴趣)
言归正传,依然还是介绍Nim的文字打头

Nim的表现力
Nim的编译器、标准库都是用Nim语言实现的
(golang目前应该不是这样,但他们貌似要计划这样做)

内置高级数据类型:strings、sets、sequences等等

拥有本地类型接口的现代类型系统:tuples、variants、generics等等

可自定义的操作符:用户自定义的操作符往往比语言内置的操作符更具有可读性,比如"$="

可以用宏的方式在编译期更改抽象语法树

好,继续说语法

关键字block和作用域
不管我们用for还是用while,都会导致开辟一个新的作用域
while false: 
  var x = "hi" 
echo(x) #这里没有缩进,已经跳出while循环的作用域,所以这是错误的
这里提到的作用域,是内建的作用域,我们可以使用block关键字显示创建一个i额作用域
block myblock: 
  var x = "hi" 
echo(x) #这里没有缩进,已经跳出myblock作用域,所以这是错误的
block关键字后面的作用域名称是可选的
关键字break
break可以迫使程序执行跳出当前作用域
像while、for和block关键字声明的作用域,它都能跳出
block myblock:
  echo("entering block")
  while true:
    echo("looping")
    break # 跳出while循环
  echo("现在仍然在myblock作用域中")
注意只是跳出当前的作用域,要想一下子多跳几层作用域,那么就要声明block关键字了
block myblock2:
  echo("entering block")
  while true:
    echo("looping")
    break myblock2 # 跳出while循环,而且也跳出myblock2作用域
关键字continue
continue关键字迫使程序马上执行下一次循环
while true:
  let x = readLine(stdin)
  if x == "": continue
  echo(x)
关键字when
关键词when起的作用和if...elif....else很相似
when system.hostOS == "windows":
  echo("running on Windows!")
elif system.hostOS == "linux":
  echo("running on Linux!")
elif system.hostOS == "macosx":
  echo("running on Mac OS X!")
else:
  echo("unknown operating system")
不同点如下:
  1. when关键词的每个分支所用的表达式,都必须能在编译期取值
  2. when关键词内的每个分支并不开辟新的作用域
  3. 当第一个分支的条件为true的时候,编译器会对第一个分支的代码做词法分析,编译器不对其他分支进行分析
当你编写系统级代码的时候可以用when关键字来代替C语言中的#ifdef
因为上面讲到的第三条特性,所以经常会写when false这样的代码,以避免编译器在编译期分析的效果(主要是因为很多东西只有在运行期才能确定)
缩进
单条指令,类似这样的代码不需要缩进:
if x: x = false
嵌套的判断,需要缩进
if x:
  if y:
    y = false
  else:
    y = true
多条指令也需要缩进
if x:
  x = false
  y = false
如果判断条件是一个挺长的表达式,那么也可以用换行缩进来保证可读性和正确性
(注意,一定要在操作符、括号开始、逗号结束之后再换行缩进)
if thisIsaLongCondition() and
    thisIsAnotherLongCondition(1,
       2, 3, 4):
  x = true
有些地方只允许你使用一个表达式,或者为了保证可读性,你最好用一个表达式的时候
你可以用括号和分号来解决问题,比如下面的代码
const fac4 = (var x = 1; for i in 1..4: x *= i; x)

今天就写到这里,喜欢的朋友请帮我点一下推荐
你们的推荐是我写下去的最大动力
下一篇就写到Nim的方法了
 
 
推荐一首歌给大家《 三十岁的女人
超爱民谣,甚至花钱买了把吉他....
 
 
另外,强烈建议博客园开发一个客户端版的编辑器
在线写博客实在是太累了
LiveWriter非常不好用
如果博客园没有人力做这个事情,我可以来做啊, 
 
目录
相关文章
|
7月前
|
C++
Nim 游戏(C++)
Nim 游戏(C++)
72 0
|
测试技术 数据安全/隐私保护 Windows
Nim之NimShellCodeLoader免杀学习(下)
Nim之NimShellCodeLoader免杀学习
249 0
LeetCode 292. Nim Game
你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
75 0
LeetCode 292. Nim Game
|
人工智能 决策智能
Nim游戏——简单博弈论
Nim游戏——简单博弈论
124 0
Nim游戏——简单博弈论
|
机器学习/深度学习
LightOJ1186——Incredible Chess(nim游戏)
LightOJ1186——Incredible Chess(nim游戏)
63 0
|
索引
Nim教程【十】
openarray类型 注意:openarray类型只能用于参数 固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便 对于一个方法来说,传入参数如果是一个数组,最好是不要限制数组的长度 也就是说,方法应该能够处理不同大小的数组 openarray类型就是为了满足这样的要求而设计...
1118 0
|
索引
Nim教程【九】
向关注这个系列的朋友们,道一声:久违了! 它并没有被我阉掉,他一定会得善终的,请各位不要灰心 Set集合类型 为了在特殊场景下提高程序的性能设置了Set类型,同时也是为了保证性能,所以Set只能容纳有序类型, Set类型可以被一个大括号实例化: var x = {},x就是一个空的set类型 还...
922 0
|
编译器 容器
Nim教程【十四】
网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在system模块中定义了异常类型的基类 所有的异常都应该派生自system.
1037 0