Nim教程【四】

这是国内第一个关于Nim的系列教程

先说废话
不得不说Rust也是门不错的语言,园子里 有人曾经说:
Rust语言除了library或keyword缩写比较恶心之外其余全部地方完爆go
还有人曾这样评价Rust语言
Rust 能够说是 D 语言二代目, 
没有 D 里的一些经验主义设计, 
并且更函数式, 
做为 a better C++ 当之无愧.
 Pattern matching, Block, Generic 这些东西, Go 有么? 
很差的地方是集成 feature 略贪心, 
指针那么多类型是有道理可是学习者容易被吓跑.
可是,可是Nim兴盛起来,Rust就不算什么了
有人不相信,问我:vczh轮子大神曾经说过这样的话吗?
我只想说:你去找他求证嘛!这样就知道我是否是瞎编的了。
高雅的Nim
宏可使用命令式编程方式来构造分析树(parse trees),使用Nim并不须要换一种编程风格来来完成元数据编程(这又是在黑.NET吗)

宏不能改变Nim的语法(不能用宏来作语法糖),由于彻底就木有这个必要,由于Nim的语法已经足够灵活了

经过缩进来分隔代码块,缩进不能使用tab制表符,这样编译器能更好的处理代码(说这一句有毛用啊?)
方法
别的语言都叫function或者method,Nim给方法叫作Procedures,咱们先来看一个方法的定义
proc yes(question: string): bool =
  echo(question, " (y/n)")
  while true:
    case readLine(stdin)
    of "y", "Y", "yes", "Yes": return true
    of "n", "N", "no", "No": return false
    else: echo("Please be clear: yes or no")

if yes("Should I delete all your important files?"):
  echo("I'm sorry Dave, I'm afraid I can't do that.")
else:
  echo("I think you know what the problem is just as well as I do.")
Nim用proc声明一个方法,这个方法的名字叫作yes,要求输入一个string类型的参数,参数名是question,返回一个bool类型的值,用return关键字返回值,并跳出这个方法的做用域(同时也跳出了while循环)
方法中的result
只要一个方法被定义成有返回值的方法, 那么Nim会给你默认建立一个result变量,
你能够在方法中不用声明就使用这个result变量,无论你方法中有没有retun指令,到方法执行结束,都会返回这个result变量
来看看下面的代码
proc sumTillNegative(x: varargs[int]): int =
  for i in x:
    if i < 0:
      return
    result = result + i

echo sumTillNegative() # echos 0
echo sumTillNegative(3, 4, 5) # echos 12
echo sumTillNegative(3, 4 , -1 , 6) # echos 7
若是你又用var 声明了一个result,就会隐藏掉Nim为你默认建立的那个result,这是result就和普通变量没有区别了  
方法中的参数
为了执行效率,在方法体内部不能改变参数的指
若是你只是想在方法体内部使用与参数同名的变量,那么,不要紧,
你能够在方法体内部,使用var从新定义一个同名参数,隐藏掉自己的方法参数
这样就能够像普通的变量同样使用它了
proc printSeq(s: seq, nprinted: int = -1) =
  var nprinted = if nprinted == -1: s.len else: min(nprinted, s.len)
  for i in 0 .. <nprinted:
    echo s[i]
在上面的方法中,同时也展现了参数的默认值是怎么设置的。
若是你必定要在方法体内部改变参数的值,
(这是十分常见的,由于这样作能够为调用者提供信息)
那么你能够在声明参数的时候,使用var关键字,就像下面这样:
proc divmod(a, b: int; res, remainder: var int) =
  res = a div b        # integer division
  remainder = a mod b  # integer modulo operation

var
  x, y: int
divmod(8, 5, x, y) # modifies x and y
echo(x)
echo(y)
在上面的方法中,参数res、remainder的值会被改变,并且方法的调用者也会获悉这个改变
丢弃返回值
在主流编程语言中,一个方法存在返回值,若是咱们只想调用这个方法,而不使用他的返回值,那咱们不理会他的返回值就是了
在Nim中,这是不容许的,你必须显示的丢弃掉他的返回值才行,就像下面的代码一下
discard yes("May I ask a pointless question?")
上面的yes方法声明的时候定义了返回值,若是你不想用它的返回值,就只能用discard显示丢弃掉他的返回值
固然,你能够在声明方法的时候,就显示的声明,这个方法的返回值是能够丢弃的,就像下面这样:
proc p(x, y: int): int {.discardable.} =
  return x + y

p(3, 4) # now valid
具名实参
有的时候一个方法包含不少参数,使用这个方法的人只记得参数的名字,但不记得参数的顺序了,那么你可使用具名参数来解决这个问题,就像下面这样:
proc createWindow(x, y, width, height: int; title: string;
                  show: bool): Window =
   ...

var w = createWindow(show = true, title = "My Application",
                     x = 0, y = 0, height = 600, width = 800)
这样作,可读性又好,使用起来又方便,真是amazing
固然你可能记得前几个参数的顺序,后面几个参数的顺序不记得了,不要紧,你能够这么用
var w = createWindow(0, 0, title = "My Application",
                     height = 600, width = 800, true)


这一篇就写到这里吧
下一篇会写操做符、迭代器等内容
喜欢的人请帮我点一下推荐,谢谢!
相关文章
相关标签/搜索