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

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

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

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

先贴张图,给大家看看,

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

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

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

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

这是国内第一个关于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将来的版本中删除掉

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

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

喜欢请点个推荐吧!!!

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

  1. CRL快速开发框架系列教程五(使用缓存)

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

  2. C#微信公众号开发系列教程五(接收事件推送与消息排重)

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

  3. 无废话ExtJs 入门教程五[文本框:TextField]

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

  4. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  5. Laravel教程 五:MVC的基本流程

    Laravel教程 五:MVC的基本流程 此文章为原创文章,未经同意,禁止转载. Controller 期间受到很多私事影响,终于还是要好好写写laravel的教程了. 上一篇我们说了数据库和Eloq ...

  6. WCF入门教程五[WCF的通信模式]

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  7. NGUI系列教程五(角色信息跟随)

    在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...

  9. 无废话WCF入门教程五[WCF的通信模式]

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  10. Swift中文教程(五)--对象和类

    原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...

随机推荐

  1. gcc相关

    linux操作系统上面开发程序, 光有了gcc 是不行的 它还需要一个   build-essential软件包作用是提供编译程序必须软件包的列表信息 也就是说 编译程序有了这个软件包它才知道 头文件 ...

  2. C#连接数据库的四种方法

    在进行以下连接数据库之前,请先在本地安装好Oracle Client,同时本次测试System.Data的版本为:2.0.0.0. 在安装Oracle Client上请注意,如果OS是3-BIT请安装 ...

  3. html() 和 text() 方法的区别

    html()方法仅支持XHTML的文档,不能用于XML文档,而text()既支持HTML文档,也 支持XML文档. html():没有参数,用于获取html的值: html(val):有参数,用于设置 ...

  4. 使用VS,获取SQL SERVER 的链接字符串

    在VS中→工具→链接到数据库→(选择数据源,这里要链接的是SQL server)Microsoft SQL Server→服务器名字(不知道的可以在登陆SQL server的时候,把服务器名字复制过来 ...

  5. 2015年九月八日---js学习总结

    参考书:javaScript Dom 编程的艺术 知识小结:一:js简史:前称ECMAScript 是一种脚本语言通常只能通过浏览器进行解释和执行. Dom(文档对象模型):是一套对文档的内容进行抽象 ...

  6. WinForm窗体PropertyGrid控件的使用

    使用过 Microsoft Visual Basic 或 Microsoft Visual Studio .NET的朋友,一定使用过属性浏览器来浏览.查看或编辑一个或多个对象的属性..NET 框架 P ...

  7. .net WebApi中使用swagger

    我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...

  8. 教你理解Fragment

    定义 Fragment 表示 Activity 中的行为或用户界面部分.我们可以将多个片段组合在一个 Activity 中来构建多窗口UI,以及在多个 Activity 中重复使用某个片段.可以将片段 ...

  9. Struts2中请求参数的接收方式和ModelDriven机制及其运用

    odelDriven 为什么需要ModelDriven 所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User如下: package cn.com.leadfar ...

  10. CodeForces 742B Batch Sort

    B. Batch Sort time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...