Hi,

2016/7/22 Fri 22:29:33 UTC+9 Ken Takata wrote:
> Hi ZyX,
> 
> 2016/7/22 Fri 20:15:33 UTC+9 ZyX wrote:
> > >> I was wrong regarding the consequences and why you should alter the
> > >> GC: it is not memory leak because cycle is not GC’d. It is *crash*
> > >> because Vim does not know that dictionary is referenced:
> > >>
> > >> ```VimL
> > >> function F()
> > >>     let d = {}
> > >>     return {-> d}
> > >> endfunction
> > >> let L = F()
> > >> call garbagecollect(1)
> > >> call feedkeys(":echo L()\n", 'n')
> > >> ```
> > >>
> > >> Save to `test.vim` and run as `vim -u NONE -i NONE -N -S test.vim`.
> > >> When I use it in Vim with optimizations it crashes immediately:
> 
> Yes, I also noticed this. I tested with the following script:
> 
>   function! Test_lambda_closure()
>     function! s:foo()
>       let x = [0]
>       return {-> [execute("let x[0] += 1"), x[0]][-1]}
>     endfunction
>   
>     let l:F = s:foo()
>     call test_garbagecollect_now()
>     call assert_equal(1, l:F())
>     call assert_equal(2, l:F())
>     call assert_equal(3, l:F())
>     call assert_equal(4, l:F())
>   endfunction
> 
> I have updated the patch:
> https://bitbucket.org/k_takata/vim-ktakata-mq/src/52c8d4fd0af2dd8bd2c79204dbbedd9ded874439/lambda-update.patch?at=default
> 
> Now it deals with GC. Also add some tests, reduce memory when local variables
> or arguments are not used.

I have slightly updated the tests:
https://bitbucket.org/k_takata/vim-ktakata-mq/src/5f8f4f212a09b1fa58a939f34559c7b3c88bb616/lambda-update.patch?at=default

It seems work well. BTW, I'm thinking the implementation again.
I thought that capture by value is easier to implement, but it is harder to
apply to normal functions inside a function. Capture by reference seems easier
to apply to normal functions.

I read the comment for mattn's implementation by Bram again:

> In the implementation it seems the dictionary storing the function-local
> variables is kept for a very long time. This relies on the garbage
> collector. It's better to use reference counting to be able to free the
> dictionary as soon as it's unused.
> 
> Also, the lambda always keeps the function-local variable dict, even
> when it's not actually used. That makes lambdas a expensive.
> It would be better to explicitly state the lambda is using its context.
> Then we can also do that with ":function", so that we are not forced to
> use a lambda if we want a closure.

Checking if a lambda is a closure is now available with my patch.
So I tried to implement reference counting based on mattn's patch.
Unfortunately it doesn't work well yet. I need help for this.
https://bitbucket.org/k_takata/vim-ktakata-mq/src/5f8f4f212a09b1fa58a939f34559c7b3c88bb616/lambda-capture_by_reference-temp.patch?at=default
(This patch should be applied after the above patch (lambda-update.patch).)
Test_circular_reference() in test_lambda.vim doesn't work well.

Which is better, capture by value or by reference?

Regards,
Ken Takata

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui