这是国内第一个关于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. jquery 删除数组元素

    expertsId.splice($.inArray(thisID.split('&')[0],expertsId),1); 1. expertsId数组名2. thisID.split('& ...

  2. URL Parsing

    [URL Parsing] urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True) Parse a URL into six ...

  3. pickle

    [pickle] Python提供了pickle模块来实现序列化. 首先,我们尝试把一个对象序列化并写入文件: pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个by ...

  4. DataGridView控件“至少有一列没有单元格模板”问题处理

    这个问题一般是没有设置单元格模板造成的. mdgv.Columns[].CellTemplate = new DataGridViewTextBoxCell();

  5. ASP.NET ZERO 学习 JTable的ChildTable用法

    效果图: Jtable的子表用法: _$masterTable.jtable({ title: app.localize('PharmacyInventory'), openChildAsAccord ...

  6. c语言检测文件是否存在int __cdecl access(const char *, int);

    最近写代码,遇到很多地方需要判断文件是否存在的.网上的方法也是千奇百怪,“百家争鸣”. fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及. 笔者 ...

  7. OA项目之弹出层中再弹出层

    弹出层中再弹出一层如图: <asp:TextBox runat="server" ID="txtUName" CssClass="span2&q ...

  8. 数据库操作(C#)

    数据库在软件开发中发挥着举足轻重的作用,基本上所有的大项目都会用到数据库.ADO .Net是一组向.Net程序员公开数据访问服务的类,其主要分为数据提供程序(Data Provider)和数据集(Da ...

  9. python学习之路-day1-python基础1

    本节内容: Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else ...

  10. python 高阶函数与装饰器

    高阶函数定义1.函数接收的参数是一个函数名2.函数的返回值是一个函数名以上两者满足任意一个,就是高阶函数装饰器定义本质就是函数,功能是为其他函数添加新功能 装饰器的原则 1.不修改被装饰函数的源代码( ...