这是国内第一个关于Nim的系列教程

先说废话
不得不说Rust也是门不错的语言,园子里
有人曾经说:
Rust语言除了library或keyword缩写比较恶心以外其他所有地方完爆go

还有人曾这样评价Rust语言

Rust 可以说是 D 语言二代目, 
没有 D 里的一些经验主义设计, 
而且更函数式, 
作为 a better C++ 当之无愧.
 Pattern matching, Block, Generic 这些东西, Go 有么? 
不好的地方是集成 feature 略贪心, 
指针那么多类型是有道理但是学习者容易被吓跑.

但是,但是Nim兴盛起来,Rust就不算什么了

有人不相信,问我:vczh轮子大神曾经说过这样的话吗?
我只想说:你去找他求证嘛!这样就知道我是不是瞎编的了。

高雅的Nim

宏可以使用命令式编程方式来构造分析树(parse trees),使用Nim并不需要换一种编程风格来来完成元数据编程(这又是在黑.NET吗)

宏不能改变Nim的语法(不能用宏来做语法糖),因为完全就木有这个必要,因为Nim的语法已经足够灵活了

通过缩进来分隔代码块,缩进不能使用tab制表符,这样编译器能更好的处理代码(说这一句有毛用啊?)
方法
别的语言都叫function或者method,Nim给方法叫做Procedures,我们先来看一个方法的定义
proc yes(question: string): bool =
  echo(question, " (y/n)")
  while true:
    case readLine(stdin)
    of "y", "Y", "yes", "Yes": return true
    of "n", "N", "no", "No": return false
    else: echo("Please be clear: yes or no")

if yes("Should I delete all your important files?"):
  echo("I'm sorry Dave, I'm afraid I can't do that.")
else:
  echo("I think you know what the problem is just as well as I do.")
Nim用proc声明一个方法,这个方法的名字叫做yes,要求输入一个string类型的参数,参数名是question,返回一个bool类型的值,用return关键字返回值,并跳出这个方法的作用域(同时也跳出了while循环)
方法中的result
只要一个方法被定义成有返回值的方法,
那么Nim会给你默认创建一个result变量,
你可以在方法中不用声明就使用这个result变量,不管你方法中有没有retun指令,到方法执行结束,都会返回这个result变量
来看看下面的代码
proc sumTillNegative(x: varargs[int]): int =
  for i in x:
    if i < 0:
      return
    result = result + i

echo sumTillNegative() # echos 0
echo sumTillNegative(3, 4, 5) # echos 12
echo sumTillNegative(3, 4 , -1 , 6) # echos 7
如果你又用var 声明了一个result,就会隐藏掉Nim为你默认创建的那个result,这是result就和普通变量没有区别了
 
方法中的参数
为了执行效率,在方法体内部不能改变参数的指
如果你只是想在方法体内部使用与参数同名的变量,那么,没关系,
你可以在方法体内部,使用var重新定义一个同名参数,隐藏掉本身的方法参数
这样就可以像普通的变量一样使用它了
proc printSeq(s: seq, nprinted: int = -1) =
  var nprinted = if nprinted == -1: s.len else: min(nprinted, s.len)
  for i in 0 .. <nprinted:
    echo s[i]

在上面的方法中,同时也展示了参数的默认值是怎么设置的。

如果你一定要在方法体内部改变参数的值,
(这是十分常见的,因为这样做可以为调用者提供信息)
那么你可以在声明参数的时候,使用var关键字,就像下面这样:
proc divmod(a, b: int; res, remainder: var int) =
  res = a div b        # integer division
  remainder = a mod b  # integer modulo operation

var
  x, y: int
divmod(8, 5, x, y) # modifies x and y
echo(x)
echo(y)

在上面的方法中,参数res、remainder的值会被改变,而且方法的调用者也会获悉这个改变

丢弃返回值
在主流编程语言中,一个方法存在返回值,如果我们只想调用这个方法,而不使用他的返回值,那我们不理会他的返回值就是了
在Nim中,这是不允许的,你必须显示的丢弃掉他的返回值才行,就像下面的代码一下
discard yes("May I ask a pointless question?")

上面的yes方法声明的时候定义了返回值,如果你不想用它的返回值,就只能用discard显示丢弃掉他的返回值

当然,你可以在声明方法的时候,就显示的声明,这个方法的返回值是可以丢弃的,就像下面这样:
proc p(x, y: int): int {.discardable.} =
  return x + y

p(3, 4) # now valid
具名实参
有的时候一个方法包含很多参数,使用这个方法的人只记得参数的名字,但不记得参数的顺序了,那么你可以使用具名参数来解决这个问题,就像下面这样:
proc createWindow(x, y, width, height: int; title: string;
                  show: bool): Window =
   ...

var w = createWindow(show = true, title = "My Application",
                     x = 0, y = 0, height = 600, width = 800)

这样做,可读性又好,使用起来又方便,真是amazing

当然你可能记得前几个参数的顺序,后面几个参数的顺序不记得了,没关系,你可以这么用
var w = createWindow(0, 0, title = "My Application",
                     height = 600, width = 800, true)


这一篇就写到这里吧
下一篇会写操作符、迭代器等内容
喜欢的人请帮我点一下推荐,谢谢!

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

  1. CRL快速开发框架系列教程四(删除数据)

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

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

    前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...

  3. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  4. 无废话ExtJs 入门教程四[表单:FormPanel]

    无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. ...

  5. TFS(Team Foundation Server)敏捷使用教程(四):工作项跟踪(1)

    工作项跟踪(1) 可跟踪性是软件过程的重要能力,TFS主要是以工作项来实现过程的可跟踪性.曾有人问:"你们实际项目里的工作项是怎么样的?能不能让我们看看?"我也一直很好奇别的公司T ...

  6. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

  7. Laravel教程 四:数据库和Eloquent

    Laravel教程 四:数据库和Eloquent 此文章为原创文章,未经同意,禁止转载. Eloquent Database 上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方 ...

  8. NGUI系列教程四(自定义Atlas,Font)

    今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...

  9. Qt零基础教程(四) QWidget详解篇

    在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...

  10. Qt零基础教程(四)QWidget详解(3):QWidget的几何结构

    Qt零基础教程(四)  QWidget详解(3):QWidget的几何结构 这篇文章里面分析了QWidget中常用的几种几何结构 下图是Qt提供的分析QWidget几何结构的一幅图,在帮助的 Wind ...

随机推荐

  1. C#中combobox 控件属性、事件、方法

    一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...

  2. 在MySQL中阻止UPDATE语句没有添加WHERE条件的发生

    如果在生产环境中使用UPDATE语句更新表数据,此时如果忘记携带本应该添加的WHERE条件,那么..Oh,no…后果可能不堪设想.那么有没有什么办法可以阻止这样的事情发生,又不使用任何的审核工具呢.. ...

  3. 根据日期 读取三个csv不留指定日期的内容 新保存一个文件

    using System;using System.Collections.Generic;using System.Drawing;using System.Globalization;using ...

  4. codeforces 361 E - Mike and Geometry Problem

    原题: Description Mike wants to prepare for IMO but he doesn't know geometry, so his teacher gave him ...

  5. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  6. BootLoader 详解(2)

    BootLoader的stage1 1.基本的硬件初始化 这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境.它通 常包括以下 ...

  7. sql Server中SET QUOTED_IDENTIFIER的使用

    在存储过程中经常会有 Sql代码   SET QUOTED_IDENTIFIER on SET QUOTED_IDENTIFIER off 这样的语句,那么SET QUOTED_IDENTIFIER到 ...

  8. sendEmail的使用

    坑!坑!坑!今天又弄了一天如何发送邮件,首先用sendmail,postfix.....等,都试过了,各种报错,然后就从早上弄到现在,在群里问问题的时候,一位好心的大哥说了他用的是sendEmail, ...

  9. MySql表名的大小写问题

    MySQL在Linux下数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名在所有的情况下均是忽略大小写的: 4 ...

  10. linux运维笔记——常用命令详解diff

    1.diff 你可以把diff看成是linux上的文件比对工具 例子文件内容: [root@localhost disks]# cat test1.txt a b c d [root@localhos ...