Ken Takata wrote: > Hi Bram and mattn, > > 2016/7/3 Sun 6:27:36 UTC+9 Bram Moolenaar wrote: > > Ken Takata wrote: > > > > > 2016/5/27 Fri 22:38:34 UTC+9 Ken Takata wrote: > > > > Hi mattn, > > > > > > > > 2016/4/18 Mon 0:30:19 UTC+9 mattn wrote: > > > > > Hi, Bram and list. > > > > > > > > > > Updated lambda patch to be applied for latest code. > > > > > > > > > > https://gist.github.com/mattn/5bc8ded21e1033c9c0ea8cd5ecbbce11 > > > > > > > > > > This include examples for timer on help file. I'm thinking lambda() > > > > > have cooperative to work with job/timer/channel. > > > > > > > > > > So I hope to add this into vim8. How do you think? > > > > > > > > > > Thanks to k-takata, haya14busa, and all of members on vim-jp. > > > > > > > > I have tested the lambda patch with the latest Vim and I found two > > > > problems. > > > > > > > > 1. garbagecollect_for_testing() was renamed. > > > > 2. Test_lambda_with_timer() fails on Cygwin. It seems that we need > > > > margins > > > > as we do in test_timers.vim. > > > > > > > > Please check attached patch. > > > > > > > > I hope that the lambda patch will be merged in Vim 8.0. > > > > This makes filter(), map() and sort() easy to use. > > > > It also works nicely with job/channel/timer features. > > > > > > I have merged my patch into your patch, and also fixed that the function > > > declaration was not sorted in alphabetical order. > > > Please check the attached patch. > > > > I have mixed feelings about this implementation. This needs more > > thoughts and discussion. > > > > > > One of the problems with the current use of a string for an expression, > > as it's passed to map(), filter(), etc., is that this is a string, which > > requires taking care of quotes. > > > > Using lambda() for that doesn't have an advantage, it's only longer: > > > > :call map(mylist, '"> " . v:val . " <"') > > :call map(mylist, lambda('"> " . v:val . " <"')) > > > > Perhaps we can define the lambda not as a function call, but as an > > operator. Then it will be parsed differently and we don't need to put > > the expression in quotes. We do want to be able to define it inline, as > > a function argument. We do need something around it, so that it's clear > > where the end is. Using {} would work, it's similar to a statement > > block in most languages. > > > > We would also like to specify arguments. We could separate the > > arguments from the statements with a "gives" symbol. That could be ->. > > This avoid the strange use of v:val and v:key to pass values to the > > expression, like map() does. > > > > call Func(arg, lambda{v -> return v * 3.12}) > > > > That way we can do this: > > call map(mylist, lambda{v -> return "> " . v . " <"}) > > > > In most cases only one statement is needed, but having a few more should > > be possible. Using | to separate statements hopefully works: > > > > call Func(arg, lambda{ v -> if v < 0 | return v * 3.12 | else | return > > v * -3.12 | endif}) > > > > Something like that. If it gets too long it's better to just define a > > function. > > > > > > The implementation also takes items from the context, thus creating a > > closure. I don't think that should be specific to a lambda, defining a > > function inside another function should be able to do the same thing. > > After all, a lambda is just a short way of defining a nameless function. > > > > 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. > > > > However, I'm not sure we need this. It is possible to bind a function > > to a dictionary, which can then contain anything that's to be kept > > between calls. > > > > > > Being able to pass a function to map(), sort(), etc. is good. However, > > it looks like in the implementation only VAR_FUNC is supported, not > > VAR_PARTIAL. It should be both. > > It seems that it's better to divide the lambda patch into several patches. > E.g.: > > 1. lambda expression > 2. closure > 3. enable to pass a function to filter() and map() > > I wrote a patch for #3. I slightly changed the specification so that a > function has both key and value as arguments. I also added some tests for > filter() and map(). Please check.
Thanks, I like this splitup. While writing an example I noticed that evaluation does not stop after the function causes an error. This requires adding "abort" to the function. I'll add a remark about that. -- hundred-and-one symptoms of being an internet addict: 198. You read all the quotes at Netaholics Anonymous and keep thinking "What's wrong with that?" /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// -- -- 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 vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.