Nim中产生迭代器的功能:分配迭代器时有效,直接调用时停留

问题描述

我试图创建一个创建迭代器的过程,如下所示:

proc makeCDFrom(start: int): iterator(): int =
  result = iterator(): int =
    var
      i: int = start
    while i >= 0:
      echo "i:",i
      yield(i)
      dec(i)

let cdFrom6 = makeCDFrom(6)
for j in cdFrom6():
  echo "j:",j

这似乎可以正常工作:

i:6
j:6
i:5
j:5
i:4
j:4
i:3
j:3
i:2
j:2
i:1
j:1
i:0
j:0

但是,最初,我尝试了这种细微变化:

proc makeCDFrom(start: int): iterator(): int =
  result = iterator(): int =
    var
      i: int = start
    while i >= 0:
      echo "i:",i
      yield(i)
      dec(i)

# Note the direct call:
for j in makeCDFrom(6)():
  echo "j:",j

当我尝试在https://play.nim-lang.org/上运行以上命令时,它似乎卡住了。什么都没有显示

为什么会有这种区别?

解决方法

为什么?

因为有一个错误。

您能做什么?

将该错误报告给github.com/nim-lang/Nim

与此同时使用其中一个

let myClosureIter = makeCDFrom(6)

或在没有工厂的情况下定义迭代器:

iterator makeCDFrom(start: int): int =
    var
      i: int = start
    while i >= 0:
      echo "i:",i
      yield(i)
      dec(i)

# Note the direct call:
for j in makeCDFrom(6):
  echo "j:",j
,

稍作更改:

proc makeCDFrom(start: int): iterator(): int =
  echo "called again"
  result = iterator(): int =
    var
      i: int = start
    while i >= 0:
      echo "i:",i
      yield(i)
      dec(i)

并在本地运行,它处于无限循环中:

called again
i:6
called again
j:6
called again
i:6
called again
j:6
called again
i:6
...