28 lines
709 B
Nim
28 lines
709 B
Nim
proc init*[ClosureType: proc](T: type ClosureType; p, env: pointer): T =
|
|
{.emit: "`result`->ClP_0 = `p`; `result`->ClE_0 = `env`;".}
|
|
|
|
when isMainModule:
|
|
type
|
|
SomeClosure = proc(y: string): int
|
|
|
|
proc makeClosure(x: int): SomeClosure =
|
|
result = proc(y: string): int =
|
|
return x + y.len + 10
|
|
|
|
var f1 = makeClosure(20)
|
|
doAssert f1("test") == 34
|
|
|
|
type
|
|
CustomEnvironment = object
|
|
captured: int
|
|
|
|
proc rawClosureProc(y: string, env: pointer): int =
|
|
return cast[ptr CustomEnvironment](env).captured + y.len + 10
|
|
|
|
var env = create CustomEnvironment
|
|
env.captured = 10
|
|
|
|
var f2: SomeClosure = SomeClosure.init(rawClosureProc, cast[pointer](env))
|
|
doAssert f2("test") == 24
|
|
|