Nim教程【四】

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

先说废话


不得不说Rust也是门不错的语言,园子里
有人曾经说:



Rust语言除了library或keyword缩写比较恶心以外其他所有地方完爆go

还有人曾这样评价Rust语言



Rust 可以说是 D 语言二代目, 

没有 D 里的一些经验主义设计, 

而且更函数式, 

作为 a better C++ 当之无愧.

 Pattern matching, Block, Generic 这些东西, Go 有么? 

不好的地方是集成 feature 略贪心, 

指针那么多类型是有道理但是学习者容易被吓跑.

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



Nim是如此受欢迎,以至于《Unix in Rust》的作者为它放弃了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)

这一篇就写到这里吧

下一篇会写操作符、迭代器等内容

喜欢的人请帮我点一下推荐,谢谢!

时间: 2025-01-28 02:17:22

Nim教程【四】的相关文章

Div+CSS布局入门教程(四) -- 用好border和clear

clear|css|教程|入门教程 四.页面制作(1)----用好border和clear 由于找工作找房子的原因,隔了这么久才能开始写教程,心里感觉很对不起一直在关注本站的朋友,今天是找到房子的第二天,于是赶快继续写教程. 这一节里面,主要就是想告诉大家如何使用好border和clear这两个属性. 首先,如果你曾用过table制作网页,你就应该知道,如果要在表格中绘制一条虚线该如何做,那需要制作一个很小的图片来填充,其实我们还有更简单的办法,只要在<td></td>中加入这么一

Android简明开发教程四:Android应用基本概念

Android平台的一个显著的特点是"低耦合".Activity是Android应用的一个最基本的用户UI模块.如果采用Windows Form 应用作为参照,Activity相当于Windows中的WinForm.和Windows 应用不同的是,运行一个Activity或是Activity之间的交互是 通过消息来实现的.也就是说如果想在起动一个Activity或是在一个Activity中启动另一个Activity,是通过发送Intent消息来 触发,而不像Windows WinFor

Swift中文教程(四)--函数与闭包

原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: 1 func greet(name: String, day: String) -> String { 2 return "Hello \(name), today is \(day)." 3 } 4 greet("Bob", "Tuesday")

Mybatis入门教程(四)之mybatis动态sql_java

推荐阅读: MyBatis入门学习教程(一)-MyBatis快速入门  什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下面就去感受Mybatis动态SQL

MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题_java

在项目开发中,我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的情况,下面小编给大家演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突问题,感兴趣的朋友一起学习吧. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, or

黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图:        从上图我们可以看清楚企业库日志应用程序模块的工作原理,其中LogFilter,Trace Source,Trace Listener,Log Formatter的信息都可以在Category配置文件中反映出来,通过配置文件,调用LogWriter类的Writer方法,就可以将包含日志信息的LogEntr

微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台  微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo   前几章中我讲解了微信开发平台提供第三方平台的好处,和使用流程,如果你看了我的文章相信你对开放平台有了初步的了解,但是在实际的开

[原创]ajax 实现用户注册功能教程四

//[原创]ajax 实现用户注册功能教程四 本教程由本站原创,转载请注明来处 作者:www.111cn.net 邮箱:drise@163.com QQ:271728967 // 现在是最后一步了,那就是注册了,这里就不多写了,只要会php的都能实现了. 各位有什么意见请直接留言评论. 下次写个ajax的文件文件平管理系统

Nim教程【十四】

网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在system模块中定义了异常类型的基类 所有的异常都应该派生自system.Exception类型 由于我们不清楚异常对象的生命周期, 所以必须在内存堆上为异常的实例分配空间 编译器不允许开发人员在栈上为异常分配空间 你如果想抛出一个异常,你必须为这个异常的msg属性赋值 按照约定,只有在非常特殊的情况