Hi,
I would like to use Nim for javascript related work, and I wonder how I can use event handlers in Nim when the proc I want to register is a closure. Often, the event needs to access external data and gets the {.closure.} annotation, and I get the following error from the compiler:
Error: type mismatch: got <proc (event: Event){.closure, noSideEffect, gcsafe, locks: <unknown>.}> but expected 'proc (event: Event)'
In JavaScript, it's easy to convert a closure to a function as functions are already first-class objects, but how to tell the compiler? Else, can I work around this?
I also have a related side questions, it seems that the javascript backend does not supports iterators (closure iterators), and I was just wondering if there was a technical reason to that or if it was just that this was not yet implemented in the compiler. I end up having to create iterators objects manually which makes some boilerplate that is strange for a language where first-class iterators are supported:
type
ProcIter*[D2] = proc(): tuple[ok: bool, data: D2]
ProcIterator*[D1,D2] = proc(d: D1): ProcIter[D2]
proc seqIterator*[D](arr: seq[D]): ProcIter[D] =
#mixin items
#var it = items # Instanciate iterator
var it = 0
var empty: D
proc next(): tuple[ok: bool, data: D] =
#let item: D = it(data)
#if finished(it): return (false, item)
#else: return (true, data)
if it >= len(arr): return (false, empty)
result = (true, arr[it])
it = it + 1
return next
And instead of a nice for loop, I have to write:
var itf = match.iterate(val)
while true:
var it = itf()
if it[0] == false: break
var item = it[1]
# ...