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

时间:2016-02-29 10:36:13

标签: nim nimrod

我正在努力学习Nim及其功能,例如迭代器;我发现以下示例工作正常。

for i in countup(1,10):   # Or its equivalent 'for i in 1..10:' 
 echo($i)

但是,以下内容不起作用:

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

for i in counter :  
 echo($i)

Nim编译器报告以下错误:

  

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

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

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

在变量声明中强制执行自定义迭代器有哪些解决方案,如countup或countdown?

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

2 个答案:

答案 0 :(得分:4)

这是因为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

答案 1 :(得分:0)

有两种方法。您可以使用sequtils模块中的toSeq过程。

    import sequtils
    let x = toSeq(1..5)
    let y = toSeq(countdown(5, 1))

或者你可以使用系统模块中的accumulateResult模板定义一个新程序(隐式导入)

    proc countup(a, b: int, step = 1): seq[int] =
      accumulateResult(countup(a, b, step))

    let x = countup(1, 5)