这是国内第一个关于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非常不好用
如果博客园没有人力做这个事情,我可以来做啊, 
 

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

  1. CRL快速开发框架系列教程三(更新数据)

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

  2. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)

    前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...

  3. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

  4. CocoStudio教程三:认识并利用CocoStudio的果实 运行2.2.1版本

    原文:CocoStudio教程三:认识并利用CocoStudio的果实 原文用的老版,用2.21搞起来好像有些问题,然后自己摸索了下,有的都是乱找的方法,只求能运行... 1,原文的CCJsonRea ...

  5. Android Studio系列教程三--快捷键

    Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...

  6. Laravel教程 三:视图变量传递和Blade

    Laravel教程 三:视图变量传递和Blade 此文章为原创文章,未经同意,禁止转载. Blade 上一篇我们简单地说了Router,Views和Controllers的工作流程,这一次我就按照上一 ...

  7. NGUI系列教程三

    接下来我们再来看Progress Bar和Slider,对比参数我们可以发现,Progress Bar和slider的明显区别在于slider多一个Thumb选项,这里的Thumb就是我们拖动的时候点 ...

  8. 中文翻译:pjsip教程(三)之ICE stream transport的使用

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...

  10. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...

随机推荐

  1. XidianOJ 1183 Water Problem: Items divided

    题目描述 Youyouyouyou is very interested in math, one day, an idea came into his mind that how many ways ...

  2. 【DIOCP知识库】连接上下文TIocpClientContext

    来自弦子介绍 [概述] 该类管理远程连接,每一个远程连接会对应一个该类的实例,开发时可以通过继承该类,扩展属性,可以存储更多的连接信息,可以重写OnRecvBuffer方法进行数据逻辑的处理 [字段/ ...

  3. android项目中使用开源数据库litepal

    下载地址 https://github.com/LitePalFramework/LitePal 参考文档 http://blog.csdn.net/guolin_blog/article/detai ...

  4. eclipse编码格式设置教程、如何为eclipse设置编码格式?

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,EcliPSe工 作空间(workspace)的缺省字符编码是操作系统缺省的编码, ...

  5. Swift 遍历数组元素

    ..<Array.count { Array[index] } for (index, element) in Array.enumerate() { print(("\(index+ ...

  6. OpenWRT连接OPENVPN的教程

    这是相当基本没有任何web界面,只是几个命令如何运行OpenWRT的 OpenVPN的例子. OpenWRT的设置更复杂,所以这个教程仅供爱好者和经验的用户使用参考. 本教程假定您有OpenWRT的安 ...

  7. 递推 N循环问题

    Description   我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算,如 ...

  8. KMP算法(快速模式匹配)

    详细理解看这里:http://kb.cnblogs.com/page/176818/ 或者这里:http://blog.csdn.net/yutianzuijin/article/details/11 ...

  9. Android Studio 中配置强大的版本管理系统

    1. 安装Git/CVS 第一步首先你需要安装Git/CVS等版本管理工具,这个请自行百度 2. 新建一个本地空仓库 新建一个仓库叫GitTest 仓库现在是空的什么都没有 找到路径,然后复制路径(这 ...

  10. 什么是领域驱动设计(Domain Driven Design)?

    本文是从 What is Domain Driven Design? 这篇文章翻译而来. ”…在很多领域,专家的作用体现在他们的专业知识上而不是智力上.“ -- Don Reinertsen 领域驱动 ...