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]
  # ...