Nim教程【五】
妈蛋,花了两天时间才搞定博客园的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 的进化一直非常大胆,
几乎每一个版本出来都是不兼容之前的版本的,
而且有些东西之前觉得很棒的(比如 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教程【五】的更多相关文章
- CRL快速开发框架系列教程五(使用缓存)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 无废话ExtJs 入门教程五[文本框:TextField]
无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ...
- Android Studio系列教程五--Gradle命令详解与导入第三方包
Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...
- Laravel教程 五:MVC的基本流程
Laravel教程 五:MVC的基本流程 此文章为原创文章,未经同意,禁止转载. Controller 期间受到很多私事影响,终于还是要好好写写laravel的教程了. 上一篇我们说了数据库和Eloq ...
- WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- NGUI系列教程五(角色信息跟随)
在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...
- 无废话WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- Swift中文教程(五)--对象和类
原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...
随机推荐
- Eclipse is running in a JRE, but a JDK is required 解决方法(转)
转自:http://comeonbabye.iteye.com/blog/1186239 安装Maven后每次启动出现警告信息: Eclipse is running in a JRE, but a ...
- webform页面传值和删除修改
一.webform跨页面传值1.内置对象地址栏数据拼接 QueryString 优点:简单好用:速度快:不消耗服务器内存. 缺点:只能传字符串:保密性差(调转页面后在地址栏显示):长度有限.响应请求对 ...
- Oracle 取随机数(转)
1.从表中随机取记录 select * from (select * from staff order by dbms_random.random) where rownum < 4 ...
- $使用dom4j可解析 返回&#x等字样的 html转义字符
如果以GET或POST请求某个系统返回,带有 $#x 那很有可能是axis服务器返回的. <?xml version="1.0" encoding="UTF-8&q ...
- PHP的OB缓存(输出缓存)
使用PHP自带的缓存机制 原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器. ...
- Selenium2+python自动化14-iframe
前言 有很多小伙伴在拿163作为登录案例的时候,发现不管怎么定位都无法定位到,到底是什么鬼呢,本篇详细介绍iframe相关的切换 以http://mail.163.com/登录页面10为案例,详细介绍 ...
- [jQuery]最新的 3.0 已发布
可以从 https://code.jquery.com/jquery/#jquery-all-1.x 找到历史版本 1.12.4 是支持 IE6 - 8 的最高版本. 下载地址 http://file ...
- docker 安装
Docker使用了一种叫AUFS的文件系统,这种文件系统可以让你一层一层地叠加修改你的文件,最底下的文件系统是只读的,如果需要修改文件,AUFS会增加一个可写的层(Layer),这样有很多好处,例如不 ...
- Android广播错误.MainActivity$MyReceiver; no empty constructor
广播的定义,如果是内部类,必须为静态类. 下面总结一下作为内部类的广播接收者在注册的时候需要注意的地方: 1.清单文件注册广播接收者时,广播接收者的名字格式需要注意.因为是内部类,所以需要在内部类 ...
- linux 下部署 redis
Redis是一种高级key-value数据库.它跟memcached类似,不过数据 可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(dif ...