tclosures.nim 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. discard """
  2. action: run
  3. """
  4. import math, random, strutils
  5. const consolePrefix = "jsCallbacks"
  6. asm """
  7. var callback = []
  8. function regCallback (fn) { callback.push (fn); }
  9. function runCallbacks () {
  10. var result = "\n"
  11. var n = 0
  12. for (var fn in callback) {
  13. n += 1
  14. result += "("+String (n)+")"
  15. result += callback [fn] ()
  16. result += "\n"
  17. }
  18. return result
  19. }
  20. function print (text) { console.log (text); }
  21. """
  22. proc consoleprint (str:cstring): void {.importc: "print", noDecl.}
  23. proc print* (a: varargs[string, `$`]) = consoleprint "$1: $2" % [consolePrefix, join(a, " ")]
  24. type CallbackProc {.importc.} = proc () : cstring
  25. proc regCallback (fn:CallbackProc) {.importc.}
  26. proc runCallbacks ():cstring {.importc.}
  27. proc `*` (s:string, n:Natural) : string = s.repeat(n)
  28. proc outer (i:Natural) : (string, int) =
  29. let c = $char(random(93) + 33)
  30. let n = random(40)
  31. let s = c * n
  32. proc inner(): cstring = ("[$1]" % $n) & s & " <--"
  33. regCallback(inner)
  34. return (s, n)
  35. var expected = "\n"
  36. for i in 1 .. 10:
  37. let (s, n) = outer(i)
  38. expected &= ("($1)[$2]" % [$i, $n]) & s & " <--"
  39. expected &= "\n"
  40. let results = runCallbacks()
  41. doAssert(expected == $results)