Hi Folks,

For the script optimization/compilation work I’ve been doing, I’ve been looking into what it will take to compile lambdas (anonymous functions). Currently, these use “reference” semantics when referring to local variables. For example, this code:
        function demo(): function()
                {
                local i = 3;
                local f = function() { print i; };
                i = 5;
                return f;
                }

        event zeek_init()
                {
                demo()();
                }

will print `5`, because the anonymous function assigned to `f` holds a reference to `demo`’s local variable `i`, so reflects the change made to `i` after the instantiation of the anonymous function. This continues to work even after `demo` exits (which requires some extra work internally to support).
Due to how the script compiler represents values, the above semantics 
would require some fairly extensive support.
My proposal is to change the semantics to instead be shallow-copying, 
which means that atomic values are copied, but aggregate values (tables, 
records, and vectors) are shared.  With this change, the above code 
would print `3`.  However, this code would still print `5`:
        function demo(): function()
                {
                local r: record { i: count; };
                r$i = 3;
                local f = function() { print r$i; };
                r$i = 5;
                return f;
                }

        event zeek_init()
                {
                demo()();
                }

This change also brings the functionality closer to that used in `when` blocks, which use deep-copying. (Arguably, it could be a good idea to change `when` to use shallow-copying, too, but that’s a different discussion.) If one wants deep-copy semantics, that can be done with explicit `copy()`s, like this:
        function demo(): function()
                {
                local r: record { i: count; };
                r$i = 3;
                local r2 = copy(r);
                local f = function() { print r2$i; };
                r$i = 5;
                return f;
                }

        event zeek_init()
                {
                demo()();
                }

— Vern
_______________________________________________
zeek-dev mailing list -- zeek-dev@lists.zeek.org
To unsubscribe send an email to zeek-dev-le...@lists.zeek.org

Reply via email to