[Ferm] adding to a list
Max Kellermann
max at duempel.org
Fri Mar 4 09:26:43 CET 2011
On 2011/03/03 22:19, Marc Haber <mh+ferm at zugschlus.de> wrote:
> 5 @def &add_l($ip) = {
> 6 @def $l=($l $ip);
> 7 }
> 8
> 9 @add_l(192.0.2.20);
There is no built-in function named "@add_l". To refer to a custom
function, you need "&add_l" (like your second example).
You're right, it doesn't work because of scoping: within the function
call, a new stack frame is created, and all variables defined here are
local.
> 11 @def &add_to_list($list,$ip) = {
> 12 @def $list=($list $ip);
> 13 }
> 14
> 15 &add_to_list($l,192.0.2.30);
Function parameters are special: they are expanded to their values
before the function is evaluated. So what this call generates is:
@def (192.0.2.1 192.0.2.10.) = (192.0.2.1 192.0.2.10. 192.0.2.30);
> Is it possible to do what I want to do?
You cannot modify a "parent stack frame" variable with the first
variant. This could maybe be implemented with something such as:
@def @parent_stackframe($l) = ....
(Ugly name, just to demonstrate the point) .. which would tell ferm to
refer to another stack frame. Not an elegant solution.
Second variant: we could add passing parameter "by reference",
outline:
@def &add_to_list(@by_ref($list), $item) = {
@def $list = ($list $item);
}
"@byref" would tell ferm to substitute $list references by the actual
variable passed here, not by its value. That seems like the more
elegant solution to me.
Max
More information about the Ferm
mailing list