proc dedup(seq0: seq[seq[int]]): seq[seq[int]] =
# given seq0, returns seq0 with no more than one occurence of seq[X][0]
var seq3 = newSeq[seq[int]]()
proc threadUniqs(seq1: seq[seq[int]], i: int): seq[int] =
var seq2 = newSeq[seq[int]]()
seq2.add seq1.filter do (x: seq[int]) -> bool: x[0] == seq1[i][0]
return seq2[seq2.high]
for i in 0 .. <seq0.len:
seq3.add seq0.threadUniqs(i)
return seq3.deduplicate
Why does this iterator fail?
import sequtils
let thread = @[@[0, 0],
@[0, 1],
@[2, 2],
@[2, 3]]
iterator threadUniqs(seq1: seq[seq[int]]): seq[seq[int]] =
for i in 0 .. <seq1.len:
yield seq1.filter do (x: seq[int]) -> bool: x[0] == seq1[i][0]
for uniqs in thread.threadUniqs:
echo uniqs
I guess some variables may not be getting lifted into the closure?
maybe this work around works:
import sequtils
let thread = @[@[0, 0],
@[0, 1],
@[2, 2],
@[2, 3]]
iterator threadUniqs(seq1: seq[seq[int]]): seq[seq[int]] =
let wrapper = proc (a: seq[seq[int]], index: int): seq[seq[int]] = a.filter do (x: seq[int]) -> bool: x[0] == a[index][0]
for i in 0 .. <seq1.len:
yield wrapper(seq1,i)
for uniqs in thread.threadUniqs:
echo uniqs
Instead of
iterator threadUniqs(seq1: seq[seq[int]]): seq[seq[int]] =
for i in 0 .. <seq1.len:
yield seq1.filter do (x: seq[int]) -> bool: x[0] == seq1[i][0]
try this:
iterator threadUniqs(seq1: seq[seq[int]]): seq[seq[int]] =
for i in 0 .. <seq1.len:
let j = i
yield seq1.filter do (x: seq[int]) -> bool: x[0] == seq1[j][0]
threaduniqs.nim(13, 0) Info: instantiation from here
threaduniqs.nim(13, 0) Info: instantiation from here
threaduniqs.nim(10, 8) Error: internal error: transformVarSection
No stack traceback available
[1] on today's devel HEAD (v0.9.4.639), and on earlier devel (v0.9.4.605)