mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 18:02:05 +00:00
52 lines
1.3 KiB
Nim
52 lines
1.3 KiB
Nim
discard """
|
|
action: run
|
|
"""
|
|
|
|
import math, random, strutils
|
|
const consolePrefix = "jsCallbacks"
|
|
|
|
asm """
|
|
var callback = []
|
|
function regCallback (fn) { callback.push (fn); }
|
|
function runCallbacks () {
|
|
var result = "\n"
|
|
var n = 0
|
|
for (var fn in callback) {
|
|
n += 1
|
|
result += "("+String (n)+")"
|
|
result += callback [fn] ()
|
|
result += "\n"
|
|
}
|
|
return result
|
|
}
|
|
function print (text) { console.log (text); }
|
|
"""
|
|
|
|
proc consoleprint (str:cstring): void {.importc: "print", noDecl.}
|
|
proc print* (a: varargs[string, `$`]) = consoleprint "$1: $2" % [consolePrefix, join (a, " ")]
|
|
|
|
type CallbackProc {.importc.} = proc () : cstring
|
|
|
|
proc regCallback (fn:CallbackProc) {.importc.}
|
|
proc runCallbacks ():cstring {.importc.}
|
|
|
|
proc `*` (s:string, n:Natural) : string = s.repeat (n)
|
|
|
|
proc outer (i:Natural) : (string, int) =
|
|
let c = $char (random (93) + 33)
|
|
let n = random (40)
|
|
let s = c * n
|
|
proc inner () : cstring = ("[$1]" % $n) & s & " <--"
|
|
regCallback (inner)
|
|
return (s, n)
|
|
|
|
var expected = "\n"
|
|
for i in 1 .. 10:
|
|
let (s, n) = outer (i)
|
|
expected &= ("($1)[$2]" % [$i, $n]) & s & " <--"
|
|
expected &= "\n"
|
|
|
|
let results = runCallbacks ()
|
|
|
|
doAssert(expected == results)
|