Nim 语言中的 countup 和 countdown 迭代器可以用于变量声明吗?

Geo*_*ver 5 nim-lang

我正在尝试学习 Nim 及其功能,例如迭代器;我发现下面的例子工作正常。

for i in countup(1,10):   # Or its equivalent 'for i in 1..10:' 
 echo($i)
Run Code Online (Sandbox Code Playgroud)

但是,以下不起作用:

var 
 counter = countup(1,10) # THIS DO NOT WORK !
 # counter = 1..10   # This works

for i in counter :  
 echo($i)
Run Code Online (Sandbox Code Playgroud)

Nim 编译器报告以下错误:

错误:试图调用未声明的例程:'countup'

countup 如何是未声明的例程,它是一个内置的迭代器!?

或者这是一个要报告的错误?

在变量声明中强制使用自定义迭代器的解决方案是什么,例如 countup 或 countdown ?

注意:我在 Windows 平台上使用 Nim 0.13.0。

def*_*ef- 6

发生这种情况是因为它countup只是一个内联迭代器。有一个定义为..内联迭代器以及一个Slice

内联迭代器是 0 成本抽象。相反,您可以通过将内联迭代器转换为一个来使用一流的闭包迭代器:

template toClosure*(i): auto =
  ## Wrap an inline iterator in a first-class closure iterator.
  iterator j: type(i) {.closure.} =
    for x in i:
      yield x
  j

var counter = toClosure(countup(1,10))

for i in counter():
  echo i
Run Code Online (Sandbox Code Playgroud)