Nim教程【五】

简介: 妈蛋,花了两天时间才搞定博客园的API, 比预期的时间整整多了1天, 不管怎么说,总算把博客园的客户端搞定了 这篇文章就是用博客园的客户端发布的, 先贴张图,给大家看看, 后面我会和博客园的领导商量一下,看看能不能发出来 (当然,如果能的话,我肯定会开源) (这个图片是直接黏贴上传的哦!) ------------------------------ 这是国内第一个关于Nim的系列教程   先说废话   业内的人认为能够直接操作系统硬件的语言才称得上系统级的编程语言 常见的系统级编程语言有:汇编、C、C++、D、GO、Rust、Nim。

妈蛋,花了两天时间才搞定博客园的API,

比预期的时间整整多了1天,

不管怎么说,总算把博客园的客户端搞定了

这篇文章就是用博客园的客户端发布的,

先贴张图,给大家看看,

后面我会和博客园的领导商量一下,看看能不能发出来

(当然,如果能的话,我肯定会开源)

blob.png

(这个图片是直接黏贴上传的哦!)

------------------------------

这是国内第一个关于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使用了

 

参数的默认值

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

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也不例外

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)之外,

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

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

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

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

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

if `==`( `+`(3, 4), 7): echo("True")

 

前置声明

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

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

# 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将来的版本中删除掉

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

 

 

 

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

喜欢请点个推荐吧!!!

目录
相关文章
|
3月前
|
C++
Nim 游戏(C++)
Nim 游戏(C++)
36 0
|
11月前
|
测试技术 数据安全/隐私保护 Windows
Nim之NimShellCodeLoader免杀学习(下)
Nim之NimShellCodeLoader免杀学习
176 0
|
机器学习/深度学习
LightOJ1186——Incredible Chess(nim游戏)
LightOJ1186——Incredible Chess(nim游戏)
44 0
|
人工智能 决策智能
Nim游戏——简单博弈论
Nim游戏——简单博弈论
88 0
Nim游戏——简单博弈论
|
索引
Nim教程【十】
openarray类型 注意:openarray类型只能用于参数 固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便 对于一个方法来说,传入参数如果是一个数组,最好是不要限制数组的长度 也就是说,方法应该能够处理不同大小的数组 openarray类型就是为了满足这样的要求而设计...
1079 0
|
索引
Nim教程【九】
向关注这个系列的朋友们,道一声:久违了! 它并没有被我阉掉,他一定会得善终的,请各位不要灰心 Set集合类型 为了在特殊场景下提高程序的性能设置了Set类型,同时也是为了保证性能,所以Set只能容纳有序类型, Set类型可以被一个大括号实例化: var x = {},x就是一个空的set类型 还...
877 0
|
编译器 容器
Nim教程【十四】
网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在system模块中定义了异常类型的基类 所有的异常都应该派生自system.
1003 0