Summary: Closures
pkg std = generic fndup : (fn : @fn::function -> @fn::function) generic fnbdup : (fn : @fn::function, buf : byte[:] -> @fn::function) generic fenvsz : (fn : @fn::function -> size) generic fnfree : (fn : @fn::function -> void) ;;
Overview
Closures are useful, however, in Myrddin, they refer to an environment that lives on the heap. In many cases, it is desirable to keep a closure around for longer than the lifetime of the function that it is capturing variables from.
These functions facilitate that need, by allowing the heapification and freeing of a closure. This is only needed for functions that capture an environment -- global functions may be passed without copying. This also holds for local functions that do not refer to the environment.
Functions
generic fndup : (fn : @fn::function -> @fn::function)
Takes any function, and copies the captured environment to the heap, if there is an environment to copy.
generic fnbdup : (fn : @fn::function, buf : byte[:] -> @fn::function)
Takes any function, and copies the captured environment to the buffer
provided. The buffer must be at least as big as the value reported by
fenvsz
.
generic fenvsz : (fn : @fn::function -> size)
Returns the size in bytes of the environment referenced by the closure fn
.
If there is no environment, then this function returns 0
.
generic fnfree : (fn : @fn::function -> void)
Frees the environment of a function heapified with fndup.