使用 echo 在 Nim 中打印一个数组

printing an array in Nim using echo

按照此处的示例: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 上安装了 im Compiler Version 0.12.0 - 可能不是最新的)。

然而,有没有一种聪明的方法可以打印任何类型的实体。是否有 Python 中的 pprint?

错误消息中引用的 $ 运算符是 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,它试图 return 标准 Nim 的值语法表示或 marshal 模块,它可以在 json:

中编码任意类型
var sum = mat1 + mat2

echo sum.repr

import marshal
echo $$sum

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

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

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