Nim编程入门
Nim 语言提供了 using 语句,使得我们可以简化相同参数的函数定义,但是需要注意不能用于 template。
正常定义的函数如下:
import streams, strutils, sequtils, strformat
type
Graph* = object
data: seq[seq[int]]
vertex, edge: int
proc addEdge*(g: var Graph; v, w: int)
proc initGraph*(vertex: int): Graph =
result.vertex = vertex
result.data = newSeqWith(vertex, newSeq[int]())
proc initGraph*(file: File): Graph =
var strm = newFileStream(file)
let
vertex = parseInt(strm.readLine)
edge = parseInt(strm.readLine)
result = initGraph(vertex)
for i in 0 ..< edge:
let
line = strm.readLine.split
(v, w) = (line[0].parseInt, line[1].parseInt)
result.addEdge(v, w)
proc addEdge*(g: var Graph; v, w: int) =
g.data[v].add(w)
g.data[w].add(v)
g.edge += 1
iterator items*(g: Graph; vertex: int): int =
for item in g.data[vertex]:
yield item
proc vertex*(g: Graph): int =
g.vertex
proc edge*(g: Graph): int =
g.edge
proc `$`*(g: Graph): string =
result.add &"{g.vertex} vertices, {g.edge} edges\n"
for v in 0 ..< g.vertex:
result.add &"{v}: "
for w in g.items(v):
result.add &"{w} "
result.add "\n"
var f = open("graph.txt", fmread)
var g = initGraph(f)
echo g
使用 using 语句,定义参数就可以省略类型了。
import streams, strutils, sequtils, strformat
type
Graph* = object
data: seq[seq[int]]
vertex, edge: int
## 使用 using 语句
using
g: Graph
v, w: int
vertex, edge: int
proc addEdge*(g: var Graph; v, w)
proc initGraph*(vertex): Graph =
result.vertex = vertex
result.data = newSeqWith(vertex, newSeq[int]())
proc initGraph*(file: File): Graph =
var strm = newFileStream(file)
let
vertex = parseInt(strm.readLine)
edge = parseInt(strm.readLine)
result = initGraph(vertex)
for i in 0 ..< edge:
let
line = strm.readLine.split
(v, w) = (line[0].parseInt, line[1].parseInt)
result.addEdge(v, w)
proc addEdge*(g: var Graph; v, w) =
g.data[v].add(w)
g.data[w].add(v)
g.edge += 1
iterator items*(g, vertex): int =
for item in g.data[vertex]:
yield item
proc vertex*(g): int =
g.vertex
proc edge*(g): int =
g.edge
proc `$`*(g): string =
result.add &"{g.vertex} vertices, {g.edge} edges\n"
for v in 0 ..< g.vertex:
result.add &"{v}: "
for w in g.items(v):
result.add &"{w} "
result.add "\n"
var f = open("graph.txt", fmread)
var g = initGraph(f)
echo g
输出
13 vertices, 13 edges
0: 5 1 2 6
1: 0
2: 0
3: 4 5
4: 3 6 5
5: 0 4 3
6: 4 0
7: 8
8: 7
9: 12 10 11
10: 9
11: 12 9
12: 9 11