函数
函数的定义与 python 相仿
不过,需要对参数、返回值的类型进行说明
proc get_max(x: int, y: int): int =
if x > y:
return x
else:
return y
echo get_max(10,18)
这里的传入参数 a, b 是按值传递的,
也就是说
修改它们的值,不会影响到主调方,这点与python一样
与 python 不同的是,
这里的 x 与 y 根本不允许你在函数中修改,那会编译不过
另外,
nim 还提供了与 c 语言传引用
效果相同的手法,
用 var 来修饰类型,在子程序中就可以修改了,并且
会影响
调用方的值,即形参的变化影响实参
var
a = 5
b = 10
proc swap(a: var int, b: var int) =
(a, b) = (b, a)
swap(a,b)
echo a
echo b
这段程序会引起 a, b 的值发生交换
在调用方式上,nim 别出心裁,引入了很多特性
proc add(x: int, y: int): int =
return x + y
var
a = 20
b = 5
c = 1
echo add(a, b)
echo a.add(b)
echo add(add(a, b), c)
echo a.add(b).add(c)
echo (a.add b)
echo a.add b
这与对象啥的没有关系
a.f(b)
与 f(a,b)
是完全等价的
这样做的好处是,有些场合的连续调用时,不需要用括号来嵌套
这是 nim 的一种通用特性,
被称为:uniform function call
实际上,在没有歧义时,括号也是可以省略的
echo 不就没括号吗?
echo 对每个有返回值的函数,
都会给它准备一个变量 result
, 并且赋好缺省值
最后也会自动返回它
proc leap(year: int):bool =
if year mod 4 == 0: result = true
if year mod 100 == 0: result = false
if year mod 400 == 0: result = true
echo leap(2000)
以上是判断是否为闰年的例子
标准模块
nim 内置了大量的标准模块来处理常见的任务
strutils
sequtils
math
就相当常用
引入模块的方式与 python 类似
不过 import x 默认把该模块的所有函数都加入当前的名字空间
import math
from strutils import split
from strutils import join
from sequtils import zip
echo sin(PI/7).round(2)
echo 2 ^ 32
let a = "this is my world"
var x = a.split()
echo x.join("--")
echo zip([1,2,3,4,5],"abc")
运行结果为:
0.43
4294967296
this--is--my--world
@[(1, 'a'), (2, 'b'), (3, 'c')]
简单交互
让用户输入个加法算式,我们求结果。
用户输出 q 则退出
from strutils import strip, split, parseInt
from sequtils import map
while true:
echo "请输入加法算式(例如 12 + 31):"
let s = readLine(stdin).strip()
if s == "q": break
let a = s.split("+").map(parseInt)
echo a[0] + a[1]
如果希望从文件读入
最简单的方法是用:readFile
给个文件名,以串的形式返回所有文本内容