diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2021-05-31 01:51:20 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-31 10:51:20 +0200 |
commit | 18b477431138d944b90e7a6e6e0412496634b518 (patch) | |
tree | 23c74b9eb166c38d2fce05fb33321cf6135d4689 /lib/core | |
parent | 98ea61f09b4bfdc13c911b1ff3fb404dfc0d1338 (diff) | |
download | Nim-18b477431138d944b90e7a6e6e0412496634b518.tar.gz |
document macros.unpackVarargs (#18106)
* deprecate macros.unpackVarargs * un-deprecate unpackVarargs and add docs+runnableExamples * update examples + tests with varargs[typed]
Diffstat (limited to 'lib/core')
-rw-r--r-- | lib/core/macros.nim | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 79c3ba28b..89f90a23b 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -1682,6 +1682,21 @@ macro getCustomPragmaVal*(n: typed, cp: typed): untyped = error(n.repr & " doesn't have a pragma named " & cp.repr, n) macro unpackVarargs*(callee: untyped; args: varargs[untyped]): untyped = + ## Calls `callee` with `args` unpacked as individual arguments. + ## This is useful in 2 cases: + ## * when forwarding `varargs[T]` for some typed `T` + ## * when forwarding `varargs[untyped]` when `args` can potentially be empty, + ## due to a compiler limitation + runnableExamples: + template call1(fun: typed; args: varargs[untyped]): untyped = + unpackVarargs(fun, args) + # when varargsLen(args) > 0: fun(args) else: fun() # this would also work + template call2(fun: typed; args: varargs[typed]): untyped = + unpackVarargs(fun, args) + proc fn1(a = 0, b = 1) = discard (a, b) + call1(fn1, 10, 11) + call1(fn1) # `args` is empty in this case + if false: call2(echo, 10, 11) # would print 1011 result = newCall(callee) for i in 0 ..< args.len: result.add args[i] |