From f6e8da4332eb974a0e2d55872667f21aece57bc8 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Tue, 11 Feb 2014 14:16:12 -0600 Subject: [PATCH 1/6] Added `$` for seq --- lib/system.nim | 12 ++++++++++++ tests/system/toString.nim | 5 +++++ 2 files changed, 17 insertions(+) create mode 100644 tests/system/toString.nim diff --git a/lib/system.nim b/lib/system.nim index 2acb989c5f..e7308f5d3d 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1672,6 +1672,18 @@ proc `$`*[T: set](x: T): string = result.add($value) result.add("}") +proc `$`*[T: seq](x: T): string = + ## generic ``$`` operator for seqs that is lifted from the components + ## of `x`. Example: + ## + ## .. code-block:: nimrod + ## $(@[23, 45]) == "@[23, 45]" + result = "@[" + for value in items(x): + if result.len > 2: result.add(", ") + result.add($value) + result.add("]") + when false: proc `$`*[T](a: openArray[T]): string = ## generic ``$`` operator for open arrays that is lifted from the elements diff --git a/tests/system/toString.nim b/tests/system/toString.nim new file mode 100644 index 0000000000..2a8ce1c0cc --- /dev/null +++ b/tests/system/toString.nim @@ -0,0 +1,5 @@ +discard """ + output:'''@[23, 45]''' +""" + +echo($(@[23, 45])) From b6e4a5229dabe20514b07a130f8b26b59a427d61 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Tue, 11 Feb 2014 14:20:55 -0600 Subject: [PATCH 2/6] explicit firstElement for `$` in collections --- lib/system.nim | 12 +++++++++--- tests/system/toString.nim | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/system.nim b/lib/system.nim index e7308f5d3d..222ed9d8dd 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1653,11 +1653,13 @@ proc `$`*[T: tuple|object](x: T): string = ## $(23, 45) == "(23, 45)" ## $() == "()" result = "(" + var firstElement = true for name, value in fieldPairs(x): - if result.len > 1: result.add(", ") + if not(firstElement): result.add(", ") result.add(name) result.add(": ") result.add($value) + firstElement = false result.add(")") proc `$`*[T: set](x: T): string = @@ -1667,9 +1669,11 @@ proc `$`*[T: set](x: T): string = ## .. code-block:: nimrod ## ${23, 45} == "{23, 45}" result = "{" + var firstElement = true for value in items(x): - if result.len > 1: result.add(", ") + if not(firstElement): result.add(", ") result.add($value) + firstElement = false result.add("}") proc `$`*[T: seq](x: T): string = @@ -1679,9 +1683,11 @@ proc `$`*[T: seq](x: T): string = ## .. code-block:: nimrod ## $(@[23, 45]) == "@[23, 45]" result = "@[" + var firstElement = true for value in items(x): - if result.len > 2: result.add(", ") + if not(firstElement): result.add(", ") result.add($value) + firstElement = false result.add("]") when false: diff --git a/tests/system/toString.nim b/tests/system/toString.nim index 2a8ce1c0cc..24dd903c07 100644 --- a/tests/system/toString.nim +++ b/tests/system/toString.nim @@ -1,5 +1,7 @@ discard """ - output:'''@[23, 45]''' + output:'''@[23, 45] +@[, \"foo\", \"bar\"]''' """ echo($(@[23, 45])) +echo($(@["", "foo", "bar"])) From 565031f0cd4768962fb19ac4e17efb994dfb4735 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Tue, 11 Feb 2014 14:21:20 -0600 Subject: [PATCH 3/6] removed `$` for openarray, was commented out --- lib/system.nim | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lib/system.nim b/lib/system.nim index 222ed9d8dd..fde24a9d04 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1690,19 +1690,6 @@ proc `$`*[T: seq](x: T): string = firstElement = false result.add("]") -when false: - proc `$`*[T](a: openArray[T]): string = - ## generic ``$`` operator for open arrays that is lifted from the elements - ## of `a`. Example: - ## - ## .. code-block:: nimrod - ## $[23, 45] == "[23, 45]" - result = "[" - for x in items(a): - if result.len > 1: result.add(", ") - result.add($x) - result.add("]") - # ----------------- GC interface --------------------------------------------- when not defined(nimrodVM) and hostOS != "standalone": From 4b09baa0a030d899b7e75bb81828e0d9df90ce32 Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Tue, 11 Feb 2014 15:06:24 -0600 Subject: [PATCH 4/6] use `.f` instead of `.16e` for floats It doesn't write a trailing zero, but it's better than floats being all over your screen. --- lib/system/sysstr.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 4244bae4cb..a6a555c082 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -252,8 +252,8 @@ proc nimIntToStr(x: int): string {.compilerRtl.} = proc nimFloatToStr(x: float): string {.compilerproc.} = var buf: array [0..59, char] - c_sprintf(buf, "%#.16e", x) - return $buf + c_sprintf(buf, "%#.f", x) + result = $buf proc nimInt64ToStr(x: int64): string {.compilerRtl.} = result = newString(sizeof(x)*4) From 33fcd112360c60078ae7ee4ddb93cbe9f44393bd Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Tue, 11 Feb 2014 17:00:22 -0600 Subject: [PATCH 5/6] add a trailing zero to $float --- lib/system/sysstr.nim | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index a6a555c082..eb9d2000ba 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -254,6 +254,8 @@ proc nimFloatToStr(x: float): string {.compilerproc.} = var buf: array [0..59, char] c_sprintf(buf, "%#.f", x) result = $buf + if result[len(result)-1] == '.': + result.add("0") proc nimInt64ToStr(x: int64): string {.compilerRtl.} = result = newString(sizeof(x)*4) From 71b69a627f0558bd2286df54caeab267d2ddeb5f Mon Sep 17 00:00:00 2001 From: Simon Hafner Date: Mon, 31 Mar 2014 15:58:52 -0500 Subject: [PATCH 6/6] added `$` for arrays --- lib/system.nim | 28 ++++++++++++++-------------- tests/system/toString.nim | 6 +++++- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/system.nim b/lib/system.nim index 38839387de..a54a25f2f8 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1705,6 +1705,15 @@ proc `$`*[T: tuple|object](x: T): string = result.add($value) firstElement = false result.add(")") + +proc collectionToString[T](x: T, b, e: string): string = + result = b + var firstElement = true + for value in items(x): + if not(firstElement): result.add(", ") + result.add($value) + firstElement = false + result.add(e) proc `$`*[T: set](x: T): string = ## generic ``$`` operator for sets that is lifted from the components @@ -1712,13 +1721,7 @@ proc `$`*[T: set](x: T): string = ## ## .. code-block:: nimrod ## ${23, 45} == "{23, 45}" - result = "{" - var firstElement = true - for value in items(x): - if not(firstElement): result.add(", ") - result.add($value) - firstElement = false - result.add("}") + collectionToString(x, "{", "}") proc `$`*[T: seq](x: T): string = ## generic ``$`` operator for seqs that is lifted from the components @@ -1726,13 +1729,10 @@ proc `$`*[T: seq](x: T): string = ## ## .. code-block:: nimrod ## $(@[23, 45]) == "@[23, 45]" - result = "@[" - var firstElement = true - for value in items(x): - if not(firstElement): result.add(", ") - result.add($value) - firstElement = false - result.add("]") + collectionToString(x, "@[", "]") + +proc `$`*[T: array](x: T): string = + collectionToString(x, "[", "]") # ----------------- GC interface --------------------------------------------- diff --git a/tests/system/toString.nim b/tests/system/toString.nim index 24dd903c07..17dcb3cb48 100644 --- a/tests/system/toString.nim +++ b/tests/system/toString.nim @@ -1,7 +1,11 @@ discard """ output:'''@[23, 45] -@[, \"foo\", \"bar\"]''' +@[, foo, bar] +[, foo, bar] +[23, 45]''' """ echo($(@[23, 45])) echo($(@["", "foo", "bar"])) +echo($(["", "foo", "bar"])) +echo($([23, 45]))