summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorClyybber <darkmine956@gmail.com>2020-02-15 19:53:40 +0100
committerGitHub <noreply@github.com>2020-02-15 19:53:40 +0100
commitf3eb0a5970ff0b9ec5ed8b95551c79cea395e279 (patch)
tree031ce9719cdb544ea51ddb08b4b686663ab34906 /lib
parent5bf571f061d53d35aab727f420afd9f415987723 (diff)
downloadNim-f3eb0a5970ff0b9ec5ed8b95551c79cea395e279.tar.gz
capture macro now accepts variables of different types (#13356)
* Capture macro can now accept variables of different types

* Add test

* Update examples

* Use let instead of var
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/sugar.nim8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/pure/sugar.nim b/lib/pure/sugar.nim
index fa28ffcf4..f18557e0e 100644
--- a/lib/pure/sugar.nim
+++ b/lib/pure/sugar.nim
@@ -165,7 +165,7 @@ template distinctBase*(T: typedesc): typedesc {.deprecated: "use distinctBase fr
   ## reverses ``type T = distinct A``; works recursively.
   typetraits.distinctBase(T)
 
-macro capture*(locals: openArray[typed], body: untyped): untyped {.since: (1, 1).} =
+macro capture*(locals: varargs[typed], body: untyped): untyped {.since: (1, 1).} =
   ## Useful when creating a closure in a loop to capture some local loop variables
   ## by their current iteration values. Example:
   ##
@@ -175,14 +175,16 @@ macro capture*(locals: openArray[typed], body: untyped): untyped {.since: (1, 1)
   ##   for i in 5..7:
   ##     for j in 7..9:
   ##       if i * j == 42:
-  ##         capture [i, j]:
+  ##         capture i, j:
   ##           myClosure = proc () = echo fmt"{i} * {j} = 42"
   ##   myClosure() # output: 6 * 7 == 42
   ##   let m = @[proc (s: string): string = "to " & s, proc (s: string): string = "not to " & s]
-  ##   var l = m.mapIt(capture([it], proc (s: string): string = it(s)))
+  ##   var l = m.mapIt(capture(it, proc (s: string): string = it(s)))
   ##   let r = l.mapIt(it("be"))
   ##   echo r[0] & ", or " & r[1] # output: to be, or not to be
   var params = @[newIdentNode("auto")]
+  let locals = if locals.len == 1 and locals[0].kind == nnkBracket: locals[0]
+               else: locals
   for arg in locals:
     params.add(newIdentDefs(ident(arg.strVal), freshIdentNodes getTypeInst arg))
   result = newNimNode(nnkCall)