diff options
author | Fredrik Høisæther Rasch <fredrik.h.rasch@uit.no> | 2017-10-31 12:23:06 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-11-18 14:18:00 +0100 |
commit | 5dfbeab65f6ba16afed58111b4276244cb1e8d34 (patch) | |
tree | a9a5e3b69f80876daf53980e82da742977b0799a /lib/pure/collections | |
parent | a583d686b46b25747fd7b946bb7debf10bde0055 (diff) | |
download | Nim-5dfbeab65f6ba16afed58111b4276244cb1e8d34.tar.gz |
Implement an `asArray` macro
fixes #6563
Diffstat (limited to 'lib/pure/collections')
-rw-r--r-- | lib/pure/collections/sequtils.nim | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim index 0eb8e6704..6041f8268 100644 --- a/lib/pure/collections/sequtils.nim +++ b/lib/pure/collections/sequtils.nim @@ -20,6 +20,8 @@ include "system/inclrtl" +import macros + when not defined(nimhygiene): {.pragma: dirty.} @@ -704,6 +706,29 @@ template newSeqWith*(len: int, init: untyped): untyped = result[i] = init result +macro asArray*(values: typed, targetType: typedesc): untyped = + ## converts a static array to an array of type ``targetType`` by converting + ## each value in the array to the specified type. + ## + ## Example: + ## + ## .. code-block:: + ## let x = asArray([0.1, 1.2, 2.3, 3.4], int) + ## doAssert x is array[4, int] + ## + ## Short notation for: + ## + ## .. code-block:: + ## let x = [(0.1).int, (1.2).int, (2.3).int, (3.4).int] + let tNode = getType(targetType)[1] + values.expectKind(nnkBracket) + result = newNimNode(nnkBracket, lineInfoFrom=values) + for i in 0 ..< len(values): + var dot = newNimNode(nnkDotExpr, lineInfoFrom=values[i]) + dot.add newPar(values[i]) + dot.add tNode + result.add dot + when isMainModule: import strutils block: # concat test @@ -992,5 +1017,9 @@ when isMainModule: seq2D[0][1] = true doAssert seq2D == @[@[true, true], @[true, false], @[false, false], @[false, false]] + block: # asArray tests + let x = asArray([1.2, 2.3, 3.4, 4.5], int) + doAssert x is array[4, int] + when not defined(testing): echo "Finished doc tests" |