Nim语言中的countup和countdown迭代器可以用在变量声明中吗?
Can countup and countdown iterators in Nim language be used in variable declaration?
我正在尝试学习 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 编译器报告以下错误:
Error: attempting to call undeclared routine: 'countup'
countup 是一个未声明的例程,它是一个内置的迭代器!?
或者这是一个需要报告的错误?
在变量声明中强制使用自定义迭代器的解决方案是什么,例如递增或递减?
注意:我在 Windows 平台上使用 Nim 0.13.0。
发生这种情况是因为 countup
只是一个内联迭代器。 ..
作为内联迭代器以及 Slice
:
都有一个定义
内联迭代器是 0 成本抽象。相反,您可以通过将内联迭代器转换为一个来使用 first-class 闭包迭代器:
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
有两种方法。您可以使用 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)
我正在尝试学习 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 编译器报告以下错误:
Error: attempting to call undeclared routine: 'countup'
countup 是一个未声明的例程,它是一个内置的迭代器!?
或者这是一个需要报告的错误?
在变量声明中强制使用自定义迭代器的解决方案是什么,例如递增或递减?
注意:我在 Windows 平台上使用 Nim 0.13.0。
发生这种情况是因为 countup
只是一个内联迭代器。 ..
作为内联迭代器以及 Slice
:
内联迭代器是 0 成本抽象。相反,您可以通过将内联迭代器转换为一个来使用 first-class 闭包迭代器:
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
有两种方法。您可以使用 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)