前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nim教程【五】

Nim教程【五】

作者头像
liulun
发布2018-01-12 15:43:22
1.2K0
发布2018-01-12 15:43:22
举报
文章被收录于专栏:liulunliulun

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

先说废话

业内的人认为能够直接操作系统硬件的语言才称得上系统级的编程语言

常见的系统级编程语言有:汇编、C、C++、D、GO、Rust、Nim。

像python、Java、c#、VB、JavaScript、PHP等,要么需要虚拟机、要么需要解释器,都称不上系统级的编程语言,都受限于它们所依赖的环境。

系统级的编程语言就不会这样,自由度非常高,

但汇编、C、C++的生产效率都比较底下

虽然C++用熟练了之后,生产效率不一定低,但这门语言的复杂度非常高,学习曲线很陡

那么就剩下较新的D、Go、Rust和Nim了

前面几篇我们借别人的口黑了Go很多次,这一篇就不黑他了

之前黑过Rust一次,这一篇再黑它一次

一个长期关注Rust发展的人说:

rust 的进化一直非常大胆, 几乎每一个版本出来都是不兼容之前的版本的, 而且有些东西之前觉得很棒的(比如 typestate), 一旦发现有更好的方案,就马上采用, 这样它的进化非常快速,如果不是一直在跟, 过上半年(两个版本),就会觉得“哇,好大变化!”。 当然,这一点也让人觉得它长期不向“成熟”收敛, 其实这是一种错觉,rust 采用的每一个新特性都很快稳定下来了, 真正关心它的人都会认同这一点。

他这句话是褒义,但我怎么越看越害怕呐!

因为Rust是Mozilla公司搞出来的东西,所以也有人比较担心这个问题

现在的变数还是 Mozilla 自身能不能挺住的问题

Nim和小伙伴们玩的很好

  • Nim的编译器可以运行在windows、linux、BSD、和mac上,所以,跨平台的问题对于Nim来说不是问题
  • 如果有必要,Nim的编译器可以生成C++或者Object C代码,这样对外提供接口就会方便很多
  • Nim可以使用很多现成的库,比如说GTK2、WindowsAPI、POSIX API、OpenGL、SDL、Cairo、Python、Lua、TCL、X11、libzip、PCRE、libcurl、mysql、sqlite等,就算你一时找不到,也可以到Nimble package manager来完成此项工作
  • Nim提供了c2nim工具可以把C语言直接格式化成Nim语言,这样C语言开发的类库就很容易被Nim使用了

参数的默认值

在定义一个方法的时候,可以为方法的参数定义好默认值,就像下面这样:

代码语言:javascript
复制
proc createWindow(x = 0, y = 0, width = 500, height = 700,
                  title = "unknown",
                  show = true): Window =
   ...
   
var w = createWindow(title = "My Application", height = 600, width = 800)

需要注意的是,Nim所有的内置类型都有一个默认值,string类型的默认值,本身就是unknown,所以没必要设置:title: string = "unknown"

方法的重载

所有的高级语言基本都有方法的重载,Nim也不例外

代码语言:javascript
复制
proc toString(x: int): string = ...
proc toString(x: bool): string =
  if x: result = "true"
  else: result = "false"

echo(toString(13))   # 调用 toString(x: int) 方法
echo(toString(true)) # 调用 the toString(x: bool) 方法

这里不会详细阐述Nim是怎么实现方法重载的,但可以肯定的告诉你,并没有使用特别复杂的算法和机制,而是基于一种简单的技术实现的

另外有歧义的方法重载编译不会通过

操作符

在Nim的类库中大量的使用了方法的重载,

主要的原因就是操作符的原理其实就是方法重载;

Nim的语法允许你使用中缀表示法(a+ b)、前缀表示法(+a);

中缀表示法就是一个接收两个参数的方法重载;

前缀表示法就是一个接收一个参数的方法重载;

不允许使用后缀表示法,因为当你想表示a++b的时候,你到底是想表示(a)+(+b)呢,还是想表示(a+)+b的意思呢?

在Nim中因为禁用了后缀表示法,所以a++b的意思是(a)+(+b)

除了一些内置的关键词操作符(and or not)之外,

操作符一般都是这些字符:+ - * \ / < > = @ $ ~ & % ! ? ^ . |

用户可以自定义自己的操作符,只要你自己顾及可读性就好

可以用两个单撇号来定义一个操作符,就像下面这样

代码语言:javascript
复制
proc `$` (x: myDataType): string = ...
# 现在你可以使用$来操作你的myDataType类型的数据:$ myDataTypeValue

我们前面说了,操作符就是方法的重载,你当然也可以像调用方法一样使用操作符

代码语言:javascript
复制
if `==`( `+`(3, 4), 7): echo("True")

前置声明

所有的变量和方法都必须在使用前声明

如果是递归方法,那就没必要这么做

代码语言:javascript
复制
# forward declaration:
proc even(n: int): bool

proc odd(n: int): bool =
  n == 1 or even(n-1)

proc even(n: int): bool =
  n == 0 or odd(n-1)

这个语法要求,会在Nim将来的版本中删除掉

这个示例也显示了一个方法的方法体可以只是一句表达式

就写到这里,本来上一篇承诺,这一篇会写到迭代器,写不了了,下一篇再写

喜欢请点个推荐吧!!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-05-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档