2017-01-19 4 views
3

Folgen Sie dem Beispiel hier: https://nim-by-example.github.io/arrays/ und ich drucke ein Array. Im Beispiel sie die Matrix drucken, aber das Echo nicht funktioniert und ich erhalte die folgende Fehlermeldung:Drucken eines Arrays in Nim mit echo

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]) 

ich dieses ist Versionierung Problem gehe davon aus (ich habe 0.12.0 im Compiler Version auf Ubuntu installiert - wahrscheinlich nicht das Neueste).

Es gibt jedoch eine intelligente Möglichkeit, um Elemente aller Art zu drucken. Gibt es einen Pprint wie in Python?

Antwort

7

Der Operator $, auf den in der Fehlermeldung verwiesen wird, ist Nims "to string" -Operator. echo erwartet, dass ein solcher Operator für den übergebenen Typ definiert ist. Es passiert einfach, dass die neueste Version des Nim system-Moduls keine Definition von $ für den array Typ enthält.

Sie können ganz einfach den Code beheben, indem Sie die folgende Definition in Ihrem eigenen Modul hinzufügen:

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" 

Daraus ergibt sich die erwartete Ausgabe:

1 1 
1 1 

Die nächste Sache zu einem universellen Druck Operator die Nim repr Proc, die versucht, die Standard-Nim-Syntax Darstellung der Werte oder die marshal-Modul, die einen beliebigen Typ in JSON codieren können:

In diesem speziellen Beispiel beiden Optionen ergeben das gleiche Resultat:

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

[[1, 1], [1, 1]] 
+0

[Standard Implementierung] (https://github.com/nim-lang/Nim/blob/devel/lib/system .nim # L2385). Es ist derzeit aufgrund einiger Bootstrapping-Probleme deaktiviert. –

+0

echo sum.repr ist nützlich! – disruptive