Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
When defining an iterator variable, the program compiles successfully if the variable is global but causes an internal compiler error if it is local.
Example
The following program compiles and execute without any problem:
iterator iter(n: int): int {.closure.} =
for i in 1..n:
yield i
var it = iterator: int = (for i in iter(5): yield i)
echo it()
echo it()
But moving the definition of "it" in a procedure makes the compiler encounter an internal error: internal error: expr: var not init iter_4607114
iterator iter(n: int): int {.closure.} =
for i in 1..n:
yield i
proc p() =
var it = iterator: int = (for i in iter(5): yield i)
echo it()
echo it()
p()
Current Output
internal error: expr: var not init iter_4607114
The error exists with devel compiler too.
Expected Output
No internal error, of course.
Possible Solution
Adding {.closure.} to the iterator defining the variable doesn’t solve the issue.
But changing the closure iterator to an inline iterator solves it.
Additional Information
There are previous issues related to iterator variable but as far as I know they are considered as closed.
$ nim -v
Nim Compiler Version 1.4.4 [Linux: amd64]
When defining an iterator variable, the program compiles successfully if the variable is global but causes an internal compiler error if it is local.
Example
The following program compiles and execute without any problem:
But moving the definition of "it" in a procedure makes the compiler encounter an internal error:
internal error: expr: var not init iter_4607114
Current Output
internal error: expr: var not init iter_4607114
The error exists with devel compiler too.Expected Output
No internal error, of course.
Possible Solution
Adding {.closure.} to the iterator defining the variable doesn’t solve the issue. But changing the closure iterator to an inline iterator solves it.
Additional Information
There are previous issues related to iterator variable but as far as I know they are considered as closed.