使用echo在Nim中打印数组

时间:2017-01-19 08:30:27

标签: nim

按照此处的示例:https://nim-by-example.github.io/arrays/我打印出一个数组。在示例中,他们打印矩阵,但回声不起作用,我得到以下错误:

matrix.nim(20, 7) Error: type mismatch: got (Matrix[2, 2])
but expected one of: 
system.$(x: T)
system.$(x: Enum)
system.$(x: int64)
system.$(x: bool)
system.$(x: char)
system.$(x: float)
system.$(x: string)
system.$(x: seq[T])
system.$(x: int)
system.$(x: uint64)
system.$(x: set[T])

我假设这是版本问题(我在Ubuntu上安装了编译器版本0.12.0 - 可能不是最新版本)。

然而,有一种智能的方式来打印任何类型的实体。 Python中有没有pprint?

1 个答案:

答案 0 :(得分:7)

错误消息中引用的$运算符是Nim的“to string”运算符。 echo期望为传入的类型定义这样的运算符。碰巧最新版本的Nim的system模块没有包含$类型array的定义。

您可以通过在自己的模块中添加以下定义来轻松修复代码:

proc `$`[T,R](m: Matrix[T,R]): string =
  result = ""
  for r in countup(1, m.H):
    for c in countup(1, m.W):
      if c != 1: result.add " "
      result.add $m[r][c]

    result.add "\n"

这会产生预期的输出:

1 1
1 1

与通用打印运算符最接近的是Nim的repr proc,它尝试返回值的标准Nim语法表示或marshal模块,它可以在json中编码任意类型:

var sum = mat1 + mat2

echo sum.repr

import marshal
echo $$sum

在这个特定的例子中,两个选项产生相同的结果:

[[1, 1], [1, 1]]

[[1, 1], [1, 1]]