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发展的人说:

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

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

 

 

 

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

喜欢请点个推荐吧!!!

时间: 2024-10-07 03:46:11

Nim教程【五】的相关文章

Android简明开发教程五:Activities

Android应用中的Activity指具有屏幕显示支持用户交互的基本模块,类似于Java ME中的MIDlet, Windows 应用中的Form. 比如可以是拨号,发送邮件的UI.每个Activity都可以含有一个Windows用于绘制用户界面.这个Windows提出占据整个屏幕,但 也可以只占据部分屏幕或说现在在其它UI上面. 一个Android应用通常由多个Activity组成,其中有一个"主Activity",为 用户启动应用时第一个显示的UI.Activity可以启动其它A

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

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演示,需要深究的朋友可以访问以下网站: http://msdn.microsoft.com/en-us/library/ff664408%28v=P

MVC5+EF6 入门完整教程五

原文:MVC5+EF6 入门完整教程五 上篇文章介绍了EF实现CRUD及一些基本的Html Helpers. 这次我们将会对之前的内容进行一些修改和重构: 引入Bootstrap样式,搭建几类共用的模板页,对UI进行一些改造 分类介绍Html Helpers 完善一些功能 文章提纲 理论基础 UI改造详细步骤 总结 理论基础 -- Bootstrap简介 以下摘自百度百科: Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Ja

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

原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/

MyBatis学习教程(五)-实现关联表查询方法详解_java

一.一对一关联  1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR() ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VAR

移动网站开发教程五,php上传下载文件

一.文件的上传 1.客户端设置: (1).在 标签中将enctype和method两个属性指明相应的值. Enctype="multipart/form-data"; Method="POST" (2).form表单中设置一个hidden类型的input框,其中name的值为MAX_FILE_SIZE的隐藏值 2.服务器端设置: (1).$_FILES多维数组:用于存储各种上传文件有关的信息 (2).文件上传与php配置文件的设置,如以下php.ini文件中的一些指

微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码

原文:微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台  微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 由于最近比较忙,这个教程没有连续上,我会尽量连载.书节上回,上次我介绍

Nim教程【十五】【完结】

模版 模版是Nim语言中的抽象语法树,它是一种简单的替换机制,在编译期被处理 这个特性使Nim语言可以和C语言很好的运行在一起 像调用一个方法一样调用一个模版 请看如下代码: template `!=` (a, b: expr): expr =   # this definition exists in the System module   not (a == b) assert(5 != 6) # the compiler rewrites that to: assert(not (5 ==

Dreamweaver 4 简明教程(五、让你的网页更漂亮之一)

dreamweaver|教程|网页 五.让你的网页更漂亮 用图片美化你的页面 上面的网页实在也太单调了,当然无法让大家满意,现在我们来一步一步美化我们的页面.而最简单直接的方法是在网页上添加图片.而很大程度上,人们说一个网页漂亮,通常就是指网页上的图片漂亮. 点击对象面板上的 按钮,然后弹出对话框,选择需要插入的的图片,如下图: 如果被选择的文件,是网站目录以外的文件,系统就会问你时候将图片复制到网站内,如下图.答案当然是"是",否则网页传上服务器后,图片就不会被显示,因为图片根本就不