妈蛋,花了两天时间才搞定博客园的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. jstl <c:forEach> 介绍

    varStatus是<c:forEach>jstl循环标签的一个属性,varStatus属性.就拿varStatus="status"来说,事实上定义了一个status ...

  2. Python str方法总结

    1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...

  3. C#获取操作系统是32位或64位的代码

    注意需添加引用System.Management) public static string Distinguish64or32System() { try { string addressWidth ...

  4. 英语语法 It all started the summer before second grade when our moving van pulled into her neighborhood

    It all started the summer before second grade when our moving van pulled into herneighborhood It all ...

  5. MFC 配合 protobuff libevent 实现的Socket 的GM工具 框架

    MFC 配合 protobuff libevent 实现的Socket 的GM工具 框架

  6. grep 和 wc命令 --- !管道命令!

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  7. Java关键字总结及详解

    Java关键字是Java的保留字,这些保留字不能用来作为常量.变量.类名.方法名及其他一切标识符的名称. 一.基本数据类型 Java中有八种基本数据类型,六种数字类型(四个整数型.六中浮点型),一种字 ...

  8. easyul获取各种属性ID 和赋值

    //span赋值 $('#state1').text("审核通过"); //textarea赋值 $("#memo").val('');  //隐藏域 $(&q ...

  9. Scrum会议(Beta版本)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  10. 设置随处都可以调用tcc的编译环境

    tcc的短小精悍,编译速度快,以及独特的直接运行c代码功能,让tcc成为一个出色的编译器,横跨linux,windows平台. 笔者目前尚处于学习c(ANSI c/ISO c)阶段,为了加强手写代码的 ...